Linq Содержит метод для объекта

У меня есть объект User и это - следующий класс:

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

И у меня есть a IEnumerable<User>

Я хочу узнать, существует ли один определенный пользователь в IEnumerable<User>, сравнение пользователя он - идентификатор.

Пример:

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

Как я могу сделать это? И то, что самый быстрый путь состоит в том, чтобы получить эту булевскую переменную, является этим, Содержит?

7
задан BrunoLM 20 July 2010 в 19:30
поделиться

4 ответа

Вам необходимо проверить пользователя , а не int . Enumerable. Для этого подойдет любой :

// 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
13
ответ дан 6 December 2019 в 08:13
поделиться
list.Any(u => u.ID == thing)
5
ответ дан 6 December 2019 в 08:13
поделиться

Если вы хотите избежать лямбда-выражения и думаете, что вам может потребоваться сравнить объекты 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 упорядочены в вашей коллекции. Если они были отсортированы по идентификатору и сохранены в объекте List , вы можете использовать метод List .BinarySearch () с соответствующей реализацией IComparer <Пользователь> .

4
ответ дан 6 December 2019 в 08:13
поделиться
  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);
0
ответ дан 6 December 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: