我有一个对象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
我该怎么办?检索此布尔值的最快方法是什么?是包含吗?
答案 0 :(得分:13)
您需要检查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
答案 1 :(得分:5)
list.Any(u => u.ID == thing)
答案 2 :(得分: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>
的相应实现。
答案 3 :(得分:0)
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);