I have a list in c#, that list contains structures, I would like to delete repeated structures, but just the structures which have some fields equal. How Can I do? thx
Asked
Active
Viewed 917 times
0
-
@Rubens Farias, not everything is homework you know. there are even stupid/trivial/easy things in business and sometimes even the top programmers might miss them. – Daniel Sep 06 '11 at 10:24
-
1Can you clarify with an example, not sure if I get the requirement – SWeko Sep 06 '11 at 10:26
-
1http://stackoverflow.com/questions/4542600/interview-question-remove-duplicates-from-an-unsorted-linked-list – CharithJ Sep 06 '11 at 10:28
-
http://stackoverflow.com/questions/9673/remove-duplicates-from-array – CharithJ Sep 06 '11 at 10:29
2 Answers
0
List<Sample> samples = new List<Sample>(new[]
{
new Sample {Id = 1},
new Sample {Id = 1},
new Sample {Id = 2},
new Sample {Id = 3},
new Sample {Id = 1}
});
var duplicates = samples
.Select ((s, i) => new { s.Id, Index = i }) // Get item key and index
.GroupBy (s => s.Id) // Group by Key
.Where (g => g.Count() > 1) // Get duplicated ones
.SelectMany(g => g.Skip (1) // We'll keep first one
.Select(i => i.Index)) // Get other items ids
.Reverse();
foreach (var index in duplicates)
{
samples.RemoveAt(index);
}

Rubens Farias
- 57,174
- 8
- 131
- 162
0
There are two possible solution:
- Remove the duplicates by hand: meaning iterate through the list with a nested loop.
- Assign the struct a hash code and equality check and use a
Hashset<YourStruct>
to remove the duplicates. This can be done by a customIEqualityComparer
(link) implementation or if you "own" the struct by implementing theIEquatable
interface with appropriateGetHashCode
andEquals
method overriding.
If your set is small and this operation has to be done once in your code, I would go for solution one. But if this comparison logic is used over and over again I would go for solution two.
Implementation for solution two:
struct YourStruct
{
public int Id;
}
class Comparer : IEqualityComparer<YourStruct>
{
public bool Equals(YourStruct a, YourStruct b)
{
return a.Id == b.Id;
}
public int GetHashCode(YourStruct s)
{
return s.Id;
}
}
List<YourStruct> list = new List<YourStruct>();
HashSet<YourStruct> hs = new HashSet<YourStruct>(list, new Comparer());

Stefan
- 14,530
- 4
- 55
- 62
-
thx!, and if wanted to compare objects from a class instead of structures¿? – jobormo Sep 06 '11 at 14:39
-
about the same. As long as you implement your own `GetHashCode` and `Equals`. – Stefan Sep 06 '11 at 15:10