Linq 对累积 bool 值进行聚合

oha*_*nho 4 c# linq

我有一个包含字符串的列表:

List<string> strList = new List<string>();

strList.Add("first");
strList.Add("second");
strList.Add("third");
strList.Add("fourth");
Run Code Online (Sandbox Code Playgroud)

我需要在每次迭代时向某个返回的方法发送两个字符串,bool并最终告诉结果是什么。

例如:

  • 第一次迭代:“第一”、“第二”(返回 true)
  • 第二次迭代:“第二”、“第三”(返回 true)
  • 第三次迭代:“第三”、“第四”(返回 false)

因此,所有调用的返回值是false(在这些返回值之间执行"&&")。

我必须使用 LINQ 所以我尝试做类似的事情:

strList.Aggregate<bool>((prev, current) => Method(prev,current));
Run Code Online (Sandbox Code Playgroud)

但不幸的是我做错了什么。

进一步解释:

我想为 strList 中的所有连续字符串对调用 bool Method(string, string) 并获取所有结果的布尔 &&

Gro*_*roo 6

一种方法可能是创建这些对,然后调用Enumerable.All以查看其中是否有任何一个为 false:

// create tuples
var pairs = strList
    .Zip(strList.Skip(1), Tuple.Create);

// check if all are true
var result = pairs.All(p => Method(p.Item1, p.Item2));
Run Code Online (Sandbox Code Playgroud)

但是,这是短路的(false遇到第一个后将停止评估),并且在编辑后,您似乎想要评估整个列表。

在这种情况下,您可以Aggregate<Tuple<string>, bool>在获得元组后使用(即具有不同类型累加器的重载)。从 开始true,并使用布尔值&

var finalResult = strList
    .Zip(strList.Skip(1), Tuple.Create)
    .Aggregate(true, (val, tuple) => Method(tuple.Item1, tuple.Item1) & val);
Run Code Online (Sandbox Code Playgroud)

如果您的方法接受 a Tuple,它可能会稍微更具可读性。