LINQ返回List中与其他列表中的任何名称(字符串)匹配的项目

Mar*_*tin 32 c# linq linq-to-objects linq-to-sql

我有2个清单.1是产品的集合.另一个是商店里的产品系列.

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

我有这个,但似乎没有用.有任何想法吗?

    var products = shopProducts.Where(p => p.Name.Any(listOfProducts.
             Select(l => l.Name).ToList())).ToList();
Run Code Online (Sandbox Code Playgroud)

我需要说给我所有其他名单中存在名称的商店产品.

Luk*_*keH 67

var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name))
                           .ToList();
Run Code Online (Sandbox Code Playgroud)

对于LINQ到对象,如果listOfProducts包含许多项,那么如果创建包含所有必需名称然后在查询中使用该名称,则可能会获得更好的性能HashSet<T>.HashSet<T>与任意的O(n)相比,具有O(1)查找性能IEnumerable<T>.

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

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


Jon*_*ton 10

您可以使用连接,例如:

var q = from sp in shopProducts
        join p in listOfProducts on sp.Name equals p.Name
        select sp;
Run Code Online (Sandbox Code Playgroud)

关于加入的更全面的指南就在这里.