使用LINQ,如何有条件地选择一些项目,但没有条件选择全部?

Sté*_*écy 5 c# linq select subset

我想使用myFilters从myCollection中选择元素进行过滤:

var myFilters = new List<string> {"111", "222"};
var myCollection = new List<SomeClass> {
                      new SomeClass ("111"), 
                      new SomeClass ("999")
                   };

from filter in myFilters
from item in myCollection
where item.Name == filter
select item
Run Code Online (Sandbox Code Playgroud)

将返回"111"项.

但是,如果myFilters为空,我想从myCollection返回所有项目.

var myFilters = new List<string> ();
var myCollection = new List<SomeClass> {
                          new SomeClass ("111"), 
                          new SomeClass ("999")
                    };

// Here's where I'm lost...
from filter in myFilters
from item in myCollection
where item.Name == filter
select item
Run Code Online (Sandbox Code Playgroud)

将返回所有项目("111"和"999").

dev*_*zer 8

如果这些集合规模很大,那么我建议使用连接.它看起来像这样:

var result = 
    myFilters.Any() ?
        from item in myCollection
        join filter in myFilters
        on item.Name equals filter into gj
        where gj.Any()
        select item
    : myCollection;
Run Code Online (Sandbox Code Playgroud)

使用连接的机会很容易被忽视.当列表远程大时,此连接方法将优于包含方法.如果它们很小并且性能可以接受,那么请使用最清晰的.


cuo*_*gle 5

var result = myCollection
                   .Where(i => (!myFilters.Any() || myFilters.Contains(i.Name)));
Run Code Online (Sandbox Code Playgroud)