Esiste un'operazione Linq per determinare se ci sono elementi in una raccolta che hanno gli stessi valori per una coppia di proprietà?

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

Domanda

C #: ho una collezione di oggetti. T ha 2 proprietà. Proprietà A e proprietà B. La regola alla quale questa raccolta deve attenersi è che la combinazione di valori per A e B deve essere unica all'interno della raccolta. In altre parole, A e B devono fungere da chiave primaria composita.

Esiste un'operazione in Linq che posso usare per verificare questa condizione? Mi aspetterei che sia qualcosa del genere

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

L'affermazione sopra è come vorrei verificare se ci sono elementi nella raccolta che hanno nomi duplicati, ma non so come farlo per più di una proprietà.

È stato utile?

Soluzione

Utilizza un tipo anonimo per selezionare la chiave composita, ad esempio

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

I tipi anonimi implementano automaticamente l'uguaglianza e gli hashcode in base alle loro proprietà (e il comparatore di uguaglianza predefinito per i tipi di tali proprietà).

Altri suggerimenti

Seleziona semplicemente in un nuovo oggetto anonimo

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

if (keys.Distinct().Count() != keys.Count())
{
 ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top