#c_sharp #net #linq
Есть коллекция с неограниченным числом элементов, пусть для примера будут 3 имени Listnames = 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. Listlist = 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); } }
Комментариев нет:
Отправить комментарий