Esiste un'operazione Linq per determinare se ci sono elementi in una raccolta che hanno gli stessi valori per una coppia di proprietà?
-
06-07-2019 - |
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à.
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
Puoi iniettare il tuo comparatore di uguaglianza. L'esempio è qui: http: // social .msdn.microsoft.com / forum / it-IT / linqprojectgeneral / thread / c5b71644-b2d9-422b-b7fe-ef3bef30bbac /
Seleziona semplicemente in un nuovo oggetto anonimo
var keys = items.Select( x => new { x.Name, x.Other } ).ToList();
if (keys.Distinct().Count() != keys.Count())
{
...
}