¿Estás tratando de distinguirte por más de un campo? Si es así, solo use un tipo anónimo y el operador Distinct y debería estar bien:
var query = doc.Elements("whatever")
.Select(element => new {
id = (int) element.Attribute("id"),
category = (int) element.Attribute("cat") })
.Distinct();
Si está tratando de obtener un conjunto distinto de valores de un tipo "más grande", pero solo está mirando algún subconjunto de propiedades para el aspecto de distinción, probablemente desee DistinctBy
implementarlo en MoreLINQ en 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;
}
}
}
(Si pasa null
como comparador, usará el comparador predeterminado para el tipo de clave).
Solo usa el
Distinct()
con tu propio comparador.http://msdn.microsoft.com/en-us/library/bb338049.aspx
fuente
Además de la respuesta de Jon Skeet, también puede usar el grupo por expresiones para obtener los grupos únicos junto con un conteo para cada iteración de grupos:
fuente
Para cualquiera que siga mirando; Aquí hay otra forma de implementar un comparador lambda personalizado.
luego puede crear una extensión para linq Distinct que puede incluir lambda
Uso:
fuente
Llego un poco tarde a la respuesta, pero es posible que desee hacer esto si desea todo el elemento, no solo los valores por los que desea agrupar:
Esto le dará el primer elemento completo que coincida con su grupo por selección, al igual que el segundo ejemplo de Jon Skeets usando DistinctBy, pero sin implementar el comparador IEqualityComparer. DistinctBy probablemente será más rápido, pero la solución anterior implicará menos código si el rendimiento no es un problema.
fuente
fuente
Como estamos hablando de tener cada elemento exactamente una vez, un "conjunto" tiene más sentido para mí.
Ejemplo con clases e IEqualityComparer implementados:
Ahora
setList
tendrá elementos únicosPensé en esto mientras trataba con lo
.Except()
que devuelve una diferencia establecidafuente