Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

LINQ. Найти элементы, значения свойства которых совпадают со значениями, находящимися в коллекции

#c_sharp #net #linq


Есть коллекция с неограниченным числом элементов, пусть для примера будут 3 имени

List names = new List()
{
    "Dmitry",
    "Katia",
    "Vova"
};


Предположим есть коллекция, хранящая сущности пользователей. Чтобы найти все сущности
с именем "Dima" можно сделать что-то вроде этого source.where(u => u.Name == names[0]).ToList();
А как найти всех пользователей, имена которых совпадают со значением элементов коллекции?
    


Ответы

Ответ 1



По-разному. Например, можно сделать так: var nameSet = new HashSet(names); var filteredUsers = users.Where(u => nameSet.Contains(u.Name)); (Можно, конечно, и обойтись без создания HashSet, но поиск по HashSet выполняется за O(1), а поиск по списку — за O(длины списка).)

Ответ 2



Используйте метод Intersect. List list = new List { "john","sessian","rasul" }; List list2 = new List { "john","mekka","rasul" }; IEnumerable Result = list.Intersect(list2); А для Entity надо использовать интерфейс IEqualityComparer. (для entity объектов/моделих) здесь не видно но я определил: "Person -> Id , Name". class PersonComparer : IEqualityComparer { public bool Equals(Person x, Person y) { if (x.Name == y.Name) return true; else return false; } public int GetHashCode(Person obj) { return obj.Name.GetHashCode(); } } IEnumerable Result = personList.Intersect(personList2, new PersonComparer());

Ответ 3



Предлагаю такой вариант: from u in users join n in names on u.Name equals n select u при необходимости добавить ToList(): (from u in users join n in names on u.Name equals n select u).ToList() Вот код полностью: https://ideone.com/r04d1e using System; using System.Collections.Generic; using System.Linq; class User { public string Name { get; set; } } public class Test { public static void Main() { var users = new List { new User { Name = "John" }, new User { Name = "Katia" }, new User { Name = "Dmitry" }, new User { Name = "James" }, }; var names = new List { "Dmitry", "Katia", "Vova" }; List res = (from u in users join n in names on u.Name equals n select u).ToList(); foreach (var user in res) Console.WriteLine(user.Name); } }

Комментариев нет:

Отправить комментарий