web-dev-qa-db-fra.com

LINQ renvoie des éléments dans une liste qui correspond à n'importe quel nom (chaîne) dans une autre liste

J'ai 2 listes. 1 est une collection de produits. Et l'autre est une collection de produits dans un magasin.

Je dois pouvoir retourner tous les produits de la boutique si les noms correspondent à des noms dans les produits.

J'ai ça mais ça ne semble pas marcher. Des idées?

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

Je dois dire: donnez-moi tous les produits de la boutique dont le nom existe dans l'autre liste.

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

Pour LINQ-to-Objects, si listOfProducts contient de nombreux éléments, vous peut-être obtenez de meilleures performances si vous créez un HashSet<T> contenant tous les noms requis, puis utilisez-les dans votre requête. HashSet<T> a O(1) performances de recherche par rapport à O(n) pour un arbitraire IEnumerable<T>.

var names = new HashSet<string>(listOfProducts.Select(p => p.Name));
var products = shopProducts.Where(p => names.Contains(p.Name))
                           .ToList();

Pour LINQ-to-SQL, je m'attendrais (espérons?) À ce que le fournisseur optimise automatiquement le SQL généré sans avoir besoin de modifier manuellement la requête.

66
LukeH

Vous pouvez utiliser une jointure, par exemple:

var q = from sp in shopProducts
        join p in listOfProducts on sp.Name equals p.Name
        select sp;

Un guide plus complet sur la jointure est ici .

10
Jon Egerton

Vous pouvez créer un IEqualityComparer<T> qui indique que les produits de noms égaux sont égaux.

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();
    }
}

Vous pouvez ensuite l'utiliser dans la méthode d'extension Intersect.

var products = shopProducts.Intersect(listOfProducts, new ProductNameEquality());
4
Matt Ellen

Essayez ceci s'il vous plaît

var products  = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name));
2
Theun Arbeider
var products = shopProducts
        .Where(shopProduct =>
                listOfProducts.Any(p => shopProduct.Name == p.Name))
        .ToList();
2
mgronber