Linq Contains方法用于对象的查询

8

我有一个对象 User,它是以下类:

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

我有一个 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

我该如何做呢?而且检索这个布尔值的最快方法是什么,是使用Contains吗?

4个回答

15
您需要检查一个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

6
list.Any(u => u.ID == thing)

4
如果您想避免使用lambda表达式,并且认为您可能需要在代码的其他部分按ID比较对象,请考虑编写以下比较器。
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>


0
  1. 使用list.Where(lu => lu.ID == users[0].ID)进行检查,然后测试check.Count() == 1
  2. 使用list.FirstOrDefault(lu => lu.ID == users[0].ID)进行检查,然后测试check != null
  3. 使用list.Any(user => user.ID == users[1].ID);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接