У меня есть объект 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
Как я могу сделать это? И то, что самый быстрый путь состоит в том, чтобы получить эту булевскую переменную, является этим, Содержит?
Вам необходимо проверить пользователя
, а не 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
Если вы хотите избежать лямбда-выражения и думаете, что вам может потребоваться сравнить объекты 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
с соответствующей реализацией IComparer <Пользователь>
.
var check = list.Where (lu => lu.ID == users [0] .ID)
, а затем проверьте check.Count () == 1
var check = list .FirstOrDefault (lu => lu.ID == users [0] .ID)
, а затем проверьте check! = Null
. list.Any (user => user.ID == users [1] .ID);