Linq包含对象的方法

时间:2010-07-20 19:30:03

标签: c# linq

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

我该怎么办?检索此布尔值的最快方法是什么?是包含吗?

4 个答案:

答案 0 :(得分:13)

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

答案 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)

  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);