Existe-t-il une opération Linq pour déterminer si certains éléments d'une collection ont les mêmes valeurs pour une paire de propriétés?

StackOverflow https://stackoverflow.com/questions/1630277

Question

C #: j'ai une collection d'objets. T a 2 propriétés. Propriété A et Propriété B. La règle à laquelle cette collection doit adhérer est que la combinaison des valeurs pour A et B doit être unique dans la collection. En d’autres termes, A et B doivent servir de clé primaire composite.

Existe-t-il une opération dans Linq que je peux utiliser pour vérifier cette condition? Je m'attendrais à ce que ce soit quelque chose comme

if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())

La déclaration ci-dessus indique comment vérifier si certains éléments de la collection portent des noms en double, mais je ne sais pas comment procéder pour plusieurs propriétés.

Était-ce utile?

La solution

Utilisez un type anonyme pour sélectionner la clé composée, par exemple.

int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
                         .Distinct()
                         .Count();

Les types anonymes implémentent automatiquement l'égalité et les codes de hachage en fonction de leurs propriétés (et du comparateur d'égalité par défaut pour les types de ces propriétés).

Autres conseils

Il suffit de sélectionner un nouvel objet anonyme

var keys = items.Select( x => new { x.Name, x.Other } ).ToList();

if (keys.Distinct().Count() != keys.Count())
{
 ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top