2013-06-06 27 views
7

Tôi cố gắng để tạo ra một lớp bộ nhớ cache chung rằng sẽ tổ chức một danh sách các đối tượng,
và sẽ phơi bày một phương pháp cho phép để kiểm tra xem một thể hiện của một đối tượng đã được lưu trữ dựa trên tài sản Id:Có thể sử dụng Danh sách <T> .Contains (...)?

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

tôi nhận được một lỗi biên dịch trên lệnh Contains(), nói:

không thể chuyển đổi biểu thức lambda để gõ 'T' vì nó không phải là một loại đại biểu

Làm cách nào để đạt được mục tiêu?

+3

'Chứa' mất một phần tử * có thể * để tìm kiếm, không phải là vị từ * *. –

Trả lời

18

Bạn có thể sử dụng LINQ:

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

hoặc List.Exists:

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

Cuộc gọi tốt cho 'Exists' - tôi đã quên mất điều đó. –

+0

Cảm ơn! 'Any()' giải quyết vấn đề của tôi. Tuy nhiên, 'Exists()' không tồn tại trong danh sách tự động hoàn thành của tôi. Trong không gian tên nào nó sống? – Liel

+0

@Liel: 'List.Exists' là một phương thức .NET 2 cũ trong' Danh sách '(liên kết ở trên). Vì vậy, nó sẽ được nhìn thấy. –

4

Sử dụng LINQ chức năng Any thay vì Contains. Đối với List<T>, phương pháp Contains được xác định để có một số T.

Các vấn đề liên quan