有没有办法使用 Linq 来迭代列表、检查条件并将成功和失败发送到 2 个不同的输出?

问题描述 投票:0回答:1

使用 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”的方法来做到这一点。

c# linq
1个回答
0
投票
.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

	
© www.soinside.com 2019 - 2024. All rights reserved.