Mam serię list:zapytania wiele list w jednym iść
List<foo> spamSpamAndSpam;
List<foo> spamSpamSpamSausageEggsAndSpam;
List<foo> spamSpamSpamSausageEggsBaconAndSpam;
List<foo> spamSpamSpamSpamSpamWithoutSpam;
List<foo> spamSpamSpamSpamSpamSpamSpamSpamSpamLovelySpamWonderfulSpam;
Mam też szereg wartości szukam w mieniu 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");
I m przechwytuje odniesienia do wszystkich foo
"sesji, w których dana właściwość (na przykład bar
) ma wartość zawartą na drugiej liście. Robię to tak:
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>.
muszę za każdym foo
który dopasowany funkcję filtrowania w jednym IEnumerable<foo>
tak, że można wywołać metodę we wszystkich z nich za jednym razem, tak:
foreach (foo incontinentRunner in okLumberjacks)
{
incontinentRunner.SillyWalk();
}
Więc moje pytanie brzmi ... Czy istnieje sposób, aby zebrać wszelkie foo
w jednej kolekcji, bez konieczności uciekania się do czegoś takiego:
ni = ni.Concat(someList.Where(filter));
I Czy istnieje jakiś bardziej elegancki sposób na zrobienie czegoś takiego z Linq? Szukam coś takiego:
okLumberjacks = spamSpamAndSpam.
And(spamSpamSpamSausageEggsAndSpam).
And(spamSpamSpamSausageEggsBaconAndSpam) /* etc */ .Where(deadParrot);
Albo jeszcze lepiej:
okLumberjacks = spanishInquisition.Where(deadParrot);
// Where the type of spanishInquisition is List<List<foo>>.
nie chcę zmodyfikować oryginalne listy foo
bo muszę je, ponieważ są one dla innej operacji na później w kodzie.
Wszystkie wywołania 'OfType' w twoim kodzie nic nie robią; masz już 'IEnumerable' określonego typu, więc jest to po prostu noop. – Servy
@Servy dobry punkt. Ale używam Sharepointa ... Żadna z jego klas kolekcji nie implementuje 'IEnumerable', ani nie eksponuje metody rozszerzenia 'Where', ale wszystkie eksponują' OfType', a ja jestem nowy w Linq. Edytuję pytanie, aby usunąć 'OfType'. –
Renan
+1, aby uzyskać więcej odnośników do Monty Pythona, niż sądziłem, że jest to możliwe w pytaniu dotyczącym SO. – Kevin