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.
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.
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 .
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());
Essayez ceci s'il vous plaît
var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name));
var products = shopProducts
.Where(shopProduct =>
listOfProducts.Any(p => shopProduct.Name == p.Name))
.ToList();