Si vous ne voulez pas ajouter la bibliothèque MoreLinq à votre projet juste pour obtenir la DistinctBy
fonctionnalité, vous pouvez obtenir le même résultat final en utilisant la surcharge de la Distinct
méthode de Linq qui prend un IEqualityComparer
argument.
Vous commencez par créer une classe de comparaison d'égalité personnalisée générique qui utilise la syntaxe lambda pour effectuer une comparaison personnalisée de deux instances d'une classe générique:
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);
}
}
Ensuite, dans votre code principal, vous l'utilisez comme suit:
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! :)
Ce qui précède suppose ce qui suit:
- La propriété
Person.Id
est de typeint
- La
people
collection ne contient aucun élément nul
Si la collection peut contenir des valeurs nulles, réécrivez simplement les lambdas pour vérifier la valeur null, par exemple:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
ÉDITER
Cette approche est similaire à celle de la réponse de Vladimir Nesterovsky mais plus simple.
Il est également similaire à celui de la réponse de Joel mais permet une logique de comparaison complexe impliquant plusieurs propriétés.
Cependant, si vos objets ne peuvent différer que par Id
un autre utilisateur, la réponse correcte est que tout ce que vous devez faire est de remplacer les implémentations par défaut de GetHashCode()
et Equals()
dans votre Person
classe, puis d'utiliser simplement la Distinct()
méthode prête à l'emploi de Linq pour filtrer tous les doublons.