LINQ: возвращает элементы в списке, который соответствует любым Именам (строке) в другом списке?
У меня есть 2 списка. 1 представляет собой набор продуктов. А другая - коллекция продуктов в магазине.
Мне нужно иметь возможность возвращать все shopProducts, если имена соответствуют любым Именам в продуктах.
У меня есть это, но он не работает. Любые идеи?
var products = shopProducts.Where(p => p.Name.Any(listOfProducts.
Select(l => l.Name).ToList())).ToList();
Мне действительно нужно сказать, что дайте мне все shopproducts, где имя существует в другом списке.
Любая помощь действительно ценится
Спасибо
Ответы
Ответ 1
var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name))
.ToList();
Для LINQ-to-Objects, если listOfProducts
содержит много элементов, тогда вы можете получить более высокую производительность, если вы создадите HashSet<T>
, содержащий все необходимые имена, а затем используйте это в своем запросе. HashSet<T>
имеет O (1) производительность поиска по сравнению с O (n) для произвольного IEnumerable<T>
.
var names = new HashSet<string>(listOfProducts.Select(p => p.Name));
var products = shopProducts.Where(p => names.Contains(p.Name))
.ToList();
Для LINQ-to-SQL я бы ожидал (надеюсь?), что провайдер может автоматически оптимизировать сгенерированный SQL-код без необходимости ручной настройки запроса.
Ответ 2
Вы можете использовать соединение, например:
var q = from sp in shopProducts
join p in listOfProducts on sp.Name equals p.Name
select sp;
Более полное руководство по объединению здесь.
Ответ 3
Вы можете создать IEqualityComparer<T>
, который говорит, что продукты с равными именами равны.
class ProductNameEqulity : IEqualityComparer<Product>
{
public bool Equals(Product p1, Product p2)
{
return p1.Name == p2.Name
}
public int GetHashCode(Product product)
{
return product.Name.GetHashCode();
}
}
Затем вы можете использовать это в методе расширения Intersect
.
var products = shopProducts.Intersect(listOfProducts, new ProductNameEquality());
Ответ 4
Попробуйте это пожалуйста
var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name));
Ответ 5
var products = shopProducts
.Where(shopProduct =>
listOfProducts.Any(p => shopProduct.Name == p.Name))
.ToList();