2010-05-07 11 views
7

Il metodo Confronto in Linq consente di trovare da un IEqualityComparer, ma non riesco a trovare un metodo di contropartita che consente di recuperare un elemento dallo stesso comparatore.Come ottenere un oggetto da un elenco basato su IEqualityComparer <T>

È davvero il modo migliore per farlo?

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

(sto condividendo l'uso del IEqualityComaprer con una chiamata al metodo Tranne Linq e vorrei mantenere una singola fonte per confronti di uguaglianza)

Edit: Quello che sto cercando per un metodo che ha la firma:

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

Edit2: Credo che questo funziona, è funky . ma è orribile e non avrebbe mai usarlo :(

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

Che comportamento ti aspetti se l'elemento non viene trovato? – R0MANARMY

+0

@ R0MANARMY: Non ha importanza per me, o restituire null o throw andrebbe bene. – Greg

+0

Questa domanda potrebbe anche interessarti (differenza tra l'uso di 'Single' e l'uso di' Primo') http://stackoverflow.com/questions/2724096/linq-single-vs-first – R0MANARMY

risposta

5

In primo luogo, si dovrebbe utilizzare la stessa istanza di MyEqualityComparer piuttosto che creare una nuova istanza ogni volta (si dovrebbe forse prendere in considerazione che lo rende un Singleton).

oltre a questo, non credo che ci sia un modo molto migliore di farlo se si vuole rendere più breve e più leggibile, è possibile creare un metodo di estensione che prende una IEquaityComparer<T> invece di un predicato:.

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

Tutto intorno un buon consiglio che mi porta a una soluzione più pulita. Immagino che la risposta finale sia "non esiste, crea il tuo". – Greg

Problemi correlati