Quiero obtener los valores distintos en una lista, pero no en la comparación de igualdad estándar.¿Por qué no hay un método Linq para devolver valores distintos por un predicado?
Lo que quiero hacer es algo como esto:
return myList.Distinct((x, y) => x.Url == y.Url);
no puedo, no hay ningún método de extensión de LINQ que hará esto - sólo uno que toma un IEqualityComparer
.
puedo hackear alrededor de ella con esto:
return myList.GroupBy(x => x.Url).Select(g => g.First());
pero que parece desordenado. Tampoco hace exactamente lo mismo: solo puedo usarlo aquí porque tengo una sola clave.
También podría añadir mi propia:
public static IEnumerable<T> Distinct<T>(
this IEnumerable<T> input, Func<T,T,bool> compare)
{
//write my own here
}
Pero eso parece más bien como escribir algo que debería estar allí en primer lugar.
¿Alguien sabe por qué este método no está allí?
¿Echo de menos algo?
Gracias por la respuesta rápida. ¡Podría usar eso! ¿Alguna idea de por qué se saltaron todos estos ... por métodos (predicados)? – Keith
No realmente, me temo. Escribiré sobre el proyecto MoreLinq cuando tenga un conjunto significativo de características ... básicamente será un proyecto de código abierto con extensiones para LINQ to Objects, y probablemente también Push LINQ. –
Si tuviera que adivinar, supondría la paridad con las opciones IQueryable, y lo que es realista (sin enfermar) en TSQL. Así que DISTINCT (table.column) está bien, pero necesitaría una clave útil y un TSQL más complejo para DistinctBy ... –