2010-07-20 31 views
7

Tôi có một đối tượng User và nó là lớp sau:LINQ Có phương pháp cho một đối tượng

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

Và tôi có một IEnumerable<User>

Tôi muốn tìm hiểu nếu một người dùng cụ thể tồn tại trong IEnumerable<User>, so sánh người dùng với ID của nó.

Một ví dụ:

IList<User> users = GetUsers();  // 1, 2, 3 
IEnumerable<User> list = GetList(); // 2, 5, 8 

// this doesn't work 
list.Contains(users[0].ID);   // false 
list.Contains(users[1].ID);   // true ! 
list.Contains(users[2].ID);   // false 

Làm thế nào tôi có thể làm điều đó? Và cách nhanh nhất để lấy boolean này là gì?

Trả lời

12

Bạn cần kiểm tra User, không phải là int. Enumerable.Any sẽ làm việc tốt cho việc này:

// this does work 
list.Any(user => user.ID == users[0].ID);   // false 
list.Any(user => user.ID == users[1].ID);   // true ! 
list.Any(user => user.ID == users[2].ID);   // false 
5
list.Any(u => u.ID == thing) 
0
  1. var check = list.Where(lu => lu.ID == users[0].ID) và sau đó thử nghiệm cho check.Count() == 1
  2. var check = list.FirstOrDefault(lu => lu.ID == users[0].ID) và sau đó thử nghiệm cho check != null.
  3. list.Any(user => user.ID == users[1].ID);
4

Nếu bạn muốn tránh các biểu thức lambda, và nghĩ rằng bạn có thể cần phải so sánh User đối tượng bằng ID trong các bộ phận khác của mã của bạn, hãy xem xét cách viết một Comparer như sau.

class UserEqualityComparer : IEqualityComparer<User> 
{ 
    bool IEqualityComparer<User>.Equals(User lhs, User rhs) 
    { 
     return lhs.ID == rhs.ID; 
    } 

    int IEqualityComparer<User>.GetHashCode(User user) 
    { 
     return user.ID; // assumes all IDs are unique. 
    } 
} 

Sau đó truy vấn danh sách của bạn trông giống như sau.

IEnumerable<User> list = GetList(); 
IEqualityComparer<User> userComparer = new UserEqualityComparer(); 

list.Contains(users[0], userComparer); 
list.Contains(users[1], userComparer); 
// etc... 

Để trả lời câu hỏi của bạn liên quan đến tốc độ thu hồi, Contains là cách nhanh nhất nếu bạn không biết làm thế nào các đối tượng User được sắp xếp trong bộ sưu tập của bạn. Nếu chúng được sắp xếp theo ID và được lưu trữ trong một đối tượng List<User>, bạn có thể sử dụng phương thức List<User>.BinarySearch() với việc triển khai thích hợp IComparer<User>.

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