【问题标题】:LINQ return items in a List that matches any Names (string) in another listLINQ 返回列表中与另一个列表中的任何名称(字符串)匹配的项目
【发布时间】:2011-03-28 08:47:35
【问题描述】:

我有 2 个列表。 1是产品集合。另一个是商店中的产品集合。

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

我有这个,但它似乎不起作用。有什么想法吗?

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

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

【问题讨论】:

  • 感谢大家的cmets!我现在可以工作了...再次感谢...已接受答案。

标签: c# linq linq-to-sql linq-to-objects


【解决方案1】:
var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name))
                           .ToList();

对于 LINQ-to-Objects,如果 listOfProducts 包含许多项目,那么如果您创建一个包含所有必需名称的 HashSet<T> 然后在查询中使用它,您可能会获得更好的性能。 HashSet<T> 的查找性能为 O(1),而任意 IEnumerable<T> 的查找性能为 O(n)。

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;

更完整的加入指南是here

【讨论】:

  • 我讨厌“特殊”的 linq 语法,但从概念上讲,连接可能是使用 linq-to-sql 的方式。使用 linq to object 我不太确定哪个会更好。
  • 关于 linq-to-object - 此答案中的查询最终转换为 Enumerable.Join 调用,根据文档,该调用具有散列查找。msdn.microsoft.com/en-us/library/bb534675.aspx - “默认相等比较器,默认,用于散列和比较键。"
【解决方案3】:

您可以创建一个IEqualityComparer&lt;T&gt;,表示具有相同名称的产品是相同的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 1970-01-01
        • 2021-04-19
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多