Подтвердить что ты не робот

LINQ: возвращает элементы в списке, который соответствует любым Именам (строке) в другом списке?

У меня есть 2 списка. 1 представляет собой набор продуктов. А другая - коллекция продуктов в магазине.

Мне нужно иметь возможность возвращать все shopProducts, если имена соответствуют любым Именам в продуктах.

У меня есть это, но он не работает. Любые идеи?

    var products = shopProducts.Where(p => p.Name.Any(listOfProducts.
             Select(l => l.Name).ToList())).ToList();

Мне действительно нужно сказать, что дайте мне все shopproducts, где имя существует в другом списке.

Любая помощь действительно ценится

Спасибо

4b9b3361

Ответ 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();