使用 Linq,您可以迭代列表,使用
Where
方法获取满足条件的所有项目。 但是,我有一个列表,其中我想获取满足条件的所有项目并执行一件事,然后获取满足条件的所有项目并执行另一项操作。
我可以想象这种场景有点像这样:
var myList = new [] { 1,2,3,4,5 }
var result = myList
.MyAwesomeSpecialWhereMethod(i => i % 2 == 0) // results in an object that has 2 lists, one containing successes and one containing failures
.SelectSuccess(i => $"{i} is even") // modifies the success list into a list of strings
.SelectFailure(i => $"{i} is odd") // modifies the failure list into a list of strings
.Collect((success, failure) => success.Union(failure)) // aggregates the success and failure list using my lambda
Console.WriteLine(result)
这样做的结果是
["2 is even","4 is even","1 is odd","3 is odd","5 is odd"] // (because I didn't bother sorting)
我认为“我有一个列表,我想对符合此条件的所有内容做一件事,对不匹配的所有内容做另一件事”的情况并不罕见。 这种结构的好处是不用用 2 个单独的
Where
循环数组两次。 我可以用循环来完成这个
foreach (var i in myList){
if (i%2 == 0){
evens.Add(i);
} else {
odds.Add(i);
}
但是我想知道是否有更“LINQy”的方法来做到这一点。
.Select
和
.ToLookup()
。var input = new List<int>{ 1,2,3,4,5 };
var result = input
.Select((item, index) => new { isEven = index % 2 == 0, item })
.ToLookup(
i => i.isEven,
i => i.item);
并称之为,
Console.Writeline(results[true]); // even
Console.Writeline(results[false]); // odd