[英]Linq Contains method for a object
我有一個對象User
,它是以下類:
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
我該怎么做? 什么是檢索此布爾值的最快方法,是包含嗎?
您需要檢查User
,而不是int
。 Enumerable.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
list.Any(u => u.ID == thing)
如果要避免使用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...
要回答與檢索速度相關的問題,如果您不知道如何在集合中訂購User
對象,則Contains
是最快的方法。 如果它們按ID排序並存儲在List<User>
對象中,則可以使用List<User>.BinarySearch()
方法以及IComparer<User>
的相應實現。
var check = list.Where(lu => lu.ID == users[0].ID)
然后測試check.Count() == 1
var check = list.FirstOrDefault(lu => lu.ID == users[0].ID)
然后測試check != null
。 list.Any(user => user.ID == users[1].ID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.