2011-03-28 42 views
28

我有2个列表。 1是产品的集合。另一个是商店中的一系列产品。LINQ:返回列表中与任何名称(字符串)在另一个列表中匹配的项目?

如果名称与产品中的任何名称匹配,我需要能够返回所有shopProducts。

我有这个,但它似乎没有工作。有任何想法吗?

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

我真的需要说给我所有的shopproducts其中名称中的其他列表中存在。

任何帮助非常感激

感谢

+0

感谢大家的评论!我现在正在工作...再次感谢..接受了答案。 – Martin 2011-03-28 12:34:20

回答

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

对于LINQ到对象,如果listOfProducts包含很多项目,那么你可能获得更好的性能如果您创建一个包含所有必需名称的HashSet<T>,然后在q中使用它uery。与任意IEnumerable<T>的O(n)相比,HashSet<T>具有O(1)查找性能。

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

对于LINQ到SQL,我希望(希望?)的提供者可以自动优化生成的SQL,而不需要查询的任何手动调整。

+0

linq反对的好方法。 – mavnn 2011-03-28 08:57:27

+0

谢谢。这真的很有帮助。 – ajexpress 2014-01-24 22:31:41

1

试试这个请

var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name)); 
1
var products = shopProducts 
     .Where(shopProduct => 
       listOfProducts.Any(p => shopProduct.Name == p.Name)) 
     .ToList(); 
10

你可以使用一个连接,例如:

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

更全面的指南连接是here

+0

我讨厌'特殊的'linq语法,但从概念上讲,连接可能是linq-to-sql的方式。用linq来对象,我不太确定哪个更好。 – mavnn 2011-03-28 08:55:47

+0

关于linq-to-object - 这个答案中的查询最终转化为一个Enumerable.Join调用,根据文档有一个哈希lookup.http://msdn.microsoft.com/en-us/library/bb534675 .aspx - “默认的相等比较器Default用于散列和比较键。” – devgeezer 2012-01-20 18:46:36

4

您可以创建一个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()); 
+0

这种方法得到我的投票。 – 2011-03-28 12:01:25

相关问题