一次查询多个列表

Ren*_*nan 5 c# linq

我有一系列的清单:

List<foo> spamSpamAndSpam;
List<foo> spamSpamSpamSausageEggsAndSpam;
List<foo> spamSpamSpamSausageEggsBaconAndSpam;
List<foo> spamSpamSpamSpamSpamWithoutSpam;
List<foo> spamSpamSpamSpamSpamSpamSpamSpamSpamLovelySpamWonderfulSpam;
Run Code Online (Sandbox Code Playgroud)

我还在以下属性中寻找一系列值foo:

List<string> Brian= new List<string>();
Brian.Add("Always");
Brian.Add("Look");
Brian.Add("On");
Brian.Add("The");
Brian.Add("Bright");
Brian.Add("Side");
Brian.Add("Of");
Brian.Add("Life");
Run Code Online (Sandbox Code Playgroud)

我正在捕捉对所有foo'ses 的引用,其中给定的属性(比方说bar)有一个值包含在后面的列表中.我是这样做的:

func<foo, bool> deadParrot = x => Brian.Contains(x.bar);

IEnumerable<foo> okLumberjacks = spamSpamAndSpam.Where(deadParrot);
okLumberjacks = okLumberjacks.Concat(
    spamSpamSpamSpamSausageEggsAndSpam.Where(deadParrot));

// And so on, concatenating the results of Where() from every list of <foo>.
Run Code Online (Sandbox Code Playgroud)

我需要foo在单个中匹配过滤功能的IEnumerable<foo>所有内容,以便我可以一次性调用所有这些中的方法,如下所示:

foreach (foo incontinentRunner in okLumberjacks)
{
    incontinentRunner.SillyWalk();
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是......有没有办法foo在一个集合中收集每一个而不必诉诸于:

ni = ni.Concat(someList.Where(filter));
Run Code Online (Sandbox Code Playgroud)

我的意思是,有没有更优雅的方式来做Linq这样的事情?我正在寻找类似的东西:

okLumberjacks = spamSpamAndSpam.
    And(spamSpamSpamSausageEggsAndSpam).
    And(spamSpamSpamSausageEggsBaconAndSpam) /* etc */ .Where(deadParrot);
Run Code Online (Sandbox Code Playgroud)

甚至更好:

okLumberjacks = spanishInquisition.Where(deadParrot);
// Where the type of spanishInquisition is List<List<foo>>.
Run Code Online (Sandbox Code Playgroud)

我不想修改原始列表,foo因为我需要它们,因为它们稍后会在代码中进行另一个操作.

Ser*_*rvy 5

创建列表列表,然后展平它:

List<List<foo>> lists = new List<List<foo>>()
{
    spamSpamAndSpam,
    spamSpamSpamSausageEggsAndSpam,
    //etc.
};

IEnumerable<foo> items = lists.SelectMany(item => item);
//do stuff with items.
Run Code Online (Sandbox Code Playgroud)