2010-05-07 13 views
7

El método de comparación en Linq le permite buscarlo con un IEqualityComparer, pero no puedo encontrar un método de contrapartida que le permita recuperar un artículo del mismo comparador.Cómo obtener un objeto de una lista basada en IEqualityComparer <T>

¿Es esta la mejor manera de hacerlo?

MyItem myFinderItem = new MyItem(keyField1, keyField2); 
if (myList.Contains(myFinderItem, new MyEqualityComparer())) 
{ 
    MyItem myRealItem = myList.Single(item => new MyEqualityComparer().Equals(item , myFinderItem)); 
} 

(estoy compartiendo el uso de la IEqualityComaprer con una llamada al método Excepto LINQ y me gustaría mantener una única fuente para las comparaciones de igualdad)

Editar: Lo que estoy buscando por un método que tiene la firma:

T Find<T>(T t, IEqualityComparer<T> comparer) 

Edit2: Supongo que esto funciona, es moderno . pero es horrible y nunca lo utilizaría :(

myList.Intersect(new List<MyItem>{myFinderItem}, comparer).Single(); 
+0

¿Qué comportamiento espera si no se encuentra el elemento? – R0MANARMY

+0

@ R0MANARMY: Realmente no me importa, ya sea devolver nulo o tirar estaría bien. – Greg

+0

Puede que también le interese esta pregunta (diferencia entre usar 'Simple' y usar' First') http://stackoverflow.com/questions/2724096/linq-single-vs-first – R0MANARMY

Respuesta

5

En primer lugar, se debe utilizar la misma instancia de MyEqualityComparer en lugar de crear una nueva instancia cada vez (que tal vez debería considerar lo que es un producto único).

Aparte de eso, no creo que hay una mejor manera de hacerlo Si desea hacerlo más corto y más fácil de leer, se puede crear un método de extensión que tiene un IEquaityComparer<T> en lugar de un predicado:.

public static T Single<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer, T value) 
{ 
    return source.Single(item => comparer.Equals(item, value)); 
} 
+0

Todo un buen consejo que me lleva a una solución más limpia. Supongo que la respuesta final es "no existe, haz la tuya". – Greg

Cuestiones relacionadas