簡體   English   中英

Linq包含對象的方法

[英]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>的相應實現。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM