Wenn Sie die MoreLinq-Bibliothek nicht zu Ihrem Projekt hinzufügen möchten, um die DistinctBy
Funktionalität zu erhalten , können Sie das gleiche Endergebnis erzielen, indem Sie die Überladung der Linq- Distinct
Methode verwenden, die ein IEqualityComparer
Argument enthält.
Sie erstellen zunächst eine generische benutzerdefinierte Gleichheitsvergleichsklasse, die die Lambda-Syntax verwendet, um einen benutzerdefinierten Vergleich zweier Instanzen einer generischen Klasse durchzuführen:
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
Dann verwenden Sie es in Ihrem Hauptcode wie folgt:
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
Voila! :) :)
Das Obige setzt Folgendes voraus:
- Eigentum
Person.Id
ist vom Typint
- Die
people
Sammlung enthält keine Nullelemente
Wenn die Sammlung Nullen enthalten könnte, schreiben Sie die Lambdas einfach neu, um nach Null zu suchen, z.
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
BEARBEITEN
Dieser Ansatz ähnelt dem in der Antwort von Vladimir Nesterovsky, ist jedoch einfacher.
Es ähnelt auch dem in Joels Antwort, ermöglicht jedoch eine komplexe Vergleichslogik mit mehreren Eigenschaften.
Wenn sich Ihre Objekte jedoch nur bis dahin unterscheiden können, Id
hat ein anderer Benutzer die richtige Antwort gegeben. Sie müssen lediglich die Standardimplementierungen von GetHashCode()
und Equals()
in Ihrer Person
Klasse überschreiben und dann einfach die Out-of-the-Box- Distinct()
Methode von Linq zum Filtern verwenden Duplikate aus.