Você está tentando se diferenciar em mais de um campo? Nesse caso, basta usar um tipo anônimo e o operador Distinct e tudo ficará bem:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Se você está tentando obter um conjunto distinto de valores de um tipo "maior", mas apenas olhando para um subconjunto de propriedades para o aspecto distintivo, provavelmente deseja DistinctBy
implementá-lo no MoreLINQ em DistinctBy.cs
:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
(Se você passar null
como comparador, ele usará o comparador padrão para o tipo de chave.)
Basta usar o
Distinct()
com seu próprio comparador.http://msdn.microsoft.com/en-us/library/bb338049.aspx
fonte
Além da resposta de Jon Skeet, você também pode usar o grupo por expressões para obter os grupos únicos com uma contagem para as iterações de cada grupo:
fonte
Para quem ainda procura; aqui está outra maneira de implementar um comparador lambda personalizado.
você pode criar uma extensão para o linq Distinct que pode receber os lambda
Uso:
fonte
Estou um pouco atrasado para a resposta, mas você pode fazer isso se quiser o elemento inteiro, não apenas os valores pelos quais deseja agrupar:
Isso fornecerá o primeiro elemento inteiro correspondente ao seu grupo por seleção, como o segundo exemplo de Jon Skeets usando DistinctBy, mas sem implementar o comparador IEqualityComparer. O DistinctBy provavelmente será mais rápido, mas a solução acima envolverá menos código se o desempenho não for um problema.
fonte
fonte
Como estamos falando de ter todos os elementos exatamente uma vez, um "conjunto" faz mais sentido para mim.
Exemplo com classes e IEqualityComparer implementados:
Agora
setList
terá elementos únicosPensei nisso ao lidar com o
.Except()
que retorna uma diferença de setfonte