Existe uma operação Linq para determinar se há itens em uma coleção que têm os mesmos valores para um par de propriedades?
-
06-07-2019 - |
Pergunta
C #: Eu tenho uma coleção de objetos. T tem 2 propriedades. Propriedade A e propriedade B. A regra que coleta isso precisa aderir é que a combinação de valores para A e B deve ser exclusivo dentro da coleção. Em outras palavras, A e B necessidade de servir como uma chave primária composta.
Existe uma operação em Linq eu posso usar para verificar essa condição? Eu esperava que fosse algo como
if (items.Select(x => x.Name).Distinct().Count() != items.Select(x => x.Name).Count())
A declaração acima é como eu iria verificar se há itens na coleção, que tem nomes duplicados, mas eu não sei como fazê-lo para mais de uma propriedade.
Solução
Use um tipo anônimo para selecionar a chave composta, por exemplo.
int totalCount = items.Count();
int distinctCount = items.Select(x => new { x.Name, x.Other })
.Distinct()
.Count();
Tipos anônimos implementar automaticamente igualdade e hashcodes com base em suas propriedades (e o comparador de igualdade padrão para os tipos dessas propriedades).
Outras dicas
Você pode injetar seu próprio comparador de igualdade. Exemplo é aqui: http: // sociais .msdn.microsoft.com / fóruns / en-US / linqprojectgeneral / thread / c5b71644-b2d9-422b-b7fe-ef3bef30bbac /
Basta selecionar em um novo, objeto anônimo
var keys = items.Select( x => new { x.Name, x.Other } ).ToList();
if (keys.Distinct().Count() != keys.Count())
{
...
}