Also davon abgesehen, dass dieses Thema quasi Linq-Alltag ist und sicherlich über Google hunderte Treffer sich finden lassen, seh ich das auch so, dass ein GroupBy (in der Laufzeit) völliger Overkill ist.
Über ein GroupBy könnte man anhand der Properties einfach den GroupKey setzen; ein ThenBy ist gar nicht notwendig.
C#-Code: |
var duplicates = mySource
.GroupBy(e => new { e.Prop1, e.Prop2 })
.Where(g => g.Count() > 1)
.SelectMany(e => e)
.ToList();
|
Aber eigentlich sauberer dürfte das ganze einfach über nen
IEqualityComparer gehen.
Der IEqualityComparer beachtet dabei nur die gewünschten Properties und über nen HashSet-Compare lassen sich duplikate sehr schnell (viel schneller als GroupBy) und übersichtlich finden.
Gerade wenn man Linq nicht verstanden hat, dann bringt es ja nichts, wenn man damit arbeitet und es nicht versteht.
Ich hab da aus den Tiefen meiner Snippets auch noch was
C#-Code: |
public static IEnumerable<TSource> FindDuplicates<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector, IEqualityComparer<TKey> comparer)
{
var set = new HashSet<TKey>(comparer);
return source.Where(item => !set.Add(selector(item)));
}
|
Man kann aber auch einfach
Except verwenden und den Comparer verwenden - gleiches Prinzip.