rationalisation de Linq's Distinct
avec Lambdas: une pensée vœux?
LINQ Distinct
est un aliment de base pour travailler avec les énumérables. Cependant, la définition des comparaisons d'égalité personnalisées pour des opérations distinctes nécessite souvent l'utilisation de IEqualityComparer
, ce qui peut sembler trop verbeux. Une surcharge basée sur Lambda, comme cet exemple hypothétique, serait beaucoup plus concise:
<code class="language-csharp">var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);</code>
Alternatives pratiques à la Lambda Distinct
Bien qu'une telle surcharge de Lambda n'existe pas dans le framework .NET, plusieurs alternatives obtiennent le même résultat:
1. L'approche GroupBy
et Select
:
Cette approche utilise GroupBy
pour regrouper des éléments en fonction d'une clé (par exemple, CustomerId
), puis sélectionne le premier élément de chaque groupe. Cela filtre efficacement les doublons.
<code class="language-csharp">IEnumerable<Customer> distinctCustomers = originalList .GroupBy(customer => customer.CustomerId) .Select(group => group.First());</code>
2. Implémentation IEqualityComparer<T>
:
Création d'une classe personnalisée qui implémente IEqualityComparer<T>
fournit une solution plus robuste et plus sécurisée. Cela permet une logique clairement définie sur l'égalité et le code de hachage en fonction de vos critères spécifiques. Il s'agit généralement de la méthode préférée pour la maintenabilité et les performances.
3. (Fortement découragé) Comparaison basée sur la réflexion:
L'utilisation de la réflexion pour comparer les objets en fonction des propriétés est très inefficace et sujette aux erreurs. Évitez cette approche sauf si vous avez absolument nécessaire.
La raison sous-jacente de l'absence d'une surcharge Lambda uniquement:
Comme l'a noté Anders Hejlsberg, une Lambda seule est insuffisante pour les opérations Distinct
. Pour un comportement cohérent, les objets jugés égaux par la comparaison doivent également produire le même code de hachage. IEqualityComparer
assure cette cohérence en nécessitant des implémentations de Equals
et GetHashCode
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!