2010-07-20 49 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>