5

私は一連のリストを持っています:

List<foo> spamSpamAndSpam;
List<foo> spamSpamSpamSausageEggsAndSpam;
List<foo> spamSpamSpamSausageEggsBaconAndSpam;
List<foo> spamSpamSpamSpamSpamWithoutSpam;
List<foo> spamSpamSpamSpamSpamSpamSpamSpamSpamLovelySpamWonderfulSpam;

のプロパティで探している一連の値もあります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");

特定のプロパティ(たとえば、 )が後者のリストに含まれる値を持つすべての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>.

次のように、それらすべてのメソッドを一度に呼び出すことができるようfooに、フィルタリング関数に一致するすべてのものを 1 つにする必要があります。IEnumerable<foo>

foreach (foo incontinentRunner in okLumberjacks)
{
    incontinentRunner.SillyWalk();
}

fooだから私の質問は...次のようなものに頼ることなく、単一のコレクションにすべてを集める方法はありますか?

ni = ni.Concat(someList.Where(filter));

つまり、Linq でこのようなことを行うよりエレガントな方法はありますか? 私は次のようなものを探しています:

okLumberjacks = spamSpamAndSpam.
    And(spamSpamSpamSausageEggsAndSpam).
    And(spamSpamSpamSausageEggsBaconAndSpam) /* etc */ .Where(deadParrot);

またはさらに良い:

okLumberjacks = spanishInquisition.Where(deadParrot);
// Where the type of spanishInquisition is List<List<foo>>.

の元のリストを変更したくありませんfoo。後でコード内で別の操作を行うために必要だからです。

4

3 に答える 3