2010-07-20 3 views
7

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

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 

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

ответ

12

Вам необходимо установить 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 
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);
4

Если вы хотите, чтобы избежать лямбда-выражения, и думаете, что вам могут понадобиться сравнить User объектов по 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... 

Чтобы ответить на ваш вопрос, связанный с скоростью поиска, Contains это самый быстрый способ, если вы не знаете, как User объекты упорядочены в вашей коллекции. Если они были отсортированы по идентификатору и сохранены в объекте List<User>, вы можете использовать метод List<User>.BinarySearch() с соответствующей реализацией IComparer<User>.

Смежные вопросы