2010-07-20 75 views
7

我有一个对象User,它是以下类:LINQ的包含方法的对象

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

而且我有一个IEnumerable<User>

我想找出是否一个特定的用户在IEnumerable<User>存在,通过它的ID比较用户。

一个例子:

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 

我该怎么办呢?什么是检索这个布尔值的最快方法,它是否包含?

回答

12

您需要检查User而不是intEnumerable.Any会为这项工作做得很好:

// 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)然后测试check.Count() == 1
  2. var check = list.FirstOrDefault(lu => lu.ID == users[0].ID),然后测试check != null
  3. list.Any(user => user.ID == users[1].ID);
4

如果你想避免lambda表达式,并认为你可能需要通过ID在你的代码的其他部分比较User对象,考虑写一个比较器,如下所示。

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

然后您的列表查询如下所示。

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

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

为您解答相关检索到的速度问题,Contains是,如果你不知道User对象是如何在您的收藏下令以最快的方式。如果它们按ID排序并存储在List<User>对象中,则可以使用List<User>.BinarySearch()方法,适当实施IComparer<User>