2013-06-06 9 views
7

Próbuję stworzyć ogólną klasę cache, które przechowuje listę obiektów,
i narazi metodę, która pozwala sprawdzić, czy instancja obiektu jest zbuforowania na podstawie właściwości ID:Czy można użyć listy <T>. Zawiera (...)?

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; } 
} 

otrzymuję błąd kompilatora na komendę Contains(), mówiąc:

nie można przekonwertować wyrażenia lambda, aby wpisać „T”, ponieważ nie jest to typ delegata

Jak mogę osiągnąć mój cel?

+3

'Zawiera" pobiera * możliwy element * do wyszukania, a nie * predykatu *. –

Odpowiedz

18

Można używać LINQ:

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

lub List.Exists:

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

Dobre wezwanie do "istnienia" - zapomniałem o tym. –

+0

Dzięki! 'Any()' rozwiązuje mój problem. Jednakże 'Exists()' nie istnieje na mojej liście autouzupełniania. W jakiej przestrzeni nazw żyje? – Liel

+0

@Liel: 'List.Exists' to stara metoda .NET 2 w' Liście '(link powyżej). Powinien być widoczny. –

4

Użyj funkcji LINQ Any zamiast Contains. W przypadku metody List<T> zdefiniowano metodę Contains, która zajmuje T.

Powiązane problemy