2013-06-06 8 views
7

Sto cercando di creare una classe cache generica che conterrà un elenco di oggetti,
ed esporrà un metodo che permette di controllare se un'istanza di un oggetto è già nella cache basata su ID proprietà:È possibile utilizzare l'elenco <T>. Contiene (...)?

public class CacheService<T> where T : BaseModel 
{ 
    private List<T> _data = new List<T>(); 

    public void Check(T obj) 
    { 
     if (_data.Contains(r => r.Id.Equals(obj.Id)) 
     { 
      //Do something 
     } 
    } 
} 

public class BaseModel 
{ 
    public int Id { get; set; } 
} 

sto ottenendo un errore di compilazione sul comando Contains(), dicendo:

Impossibile convertire espressione lambda al tipo 'T', perché non è un tipo delegato

Come posso raggiungere il mio obiettivo?

+3

'Contains' accetta un * elemento possibile * da cercare, non un * predicato *. –

risposta

18

È possibile utilizzare Linq:

bool contains = _data.Any(r => r.Id.Equals(obj.Id)); 

o List.Exists:

bool contains = _data.Exists(r => r.Id.Equals(obj.Id)); 
+1

Buona richiesta di "Esistere" - me ne ero dimenticato. –

+0

Grazie! 'Any()' risolve il mio problema. Tuttavia, 'Exists()' non esiste nel mio elenco di completamento automatico. In quale spazio dei nomi vive? – Liel

+0

@Liel: 'List.Exists' è un vecchio metodo .NET 2 in' Elenco '(collegamento sopra). Quindi dovrebbe essere visibile. –

4

utilizzare la funzione di LINQ Any invece di Contains. Per List<T>, il metodo Contains è definito per prendere uno T.

Problemi correlati