Linq对累积布尔值进行聚合

本文关键字:布尔值 Linq | 更新日期: 2023-09-27 17:58:36

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

List<string> strList = new List<string>();
strList.Add("first");
strList.Add("second");
strList.Add("third");
strList.Add("fourth");

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

例如:

  • 第一次迭代:"First","second"(返回true)
  • 第二次迭代:"Second"、"third"(返回true)
  • 第三次迭代:"第三次"、"第四次"(返回false)

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

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

strList.Aggregate<bool>((prev, current) => Method(prev,current));

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

进一步解释:

我想为strList中所有连续的字符串对调用boolMethod(string,string),并获得布尔值&amp;所有结果的

Linq对累积布尔值进行聚合

一种方法可能是创建对,然后调用Enumerable.All查看其中是否有错误:

// 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));

然而,这是一个短暂的循环(在遇到第一个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);

如果您的方法接受Tuple,那么它可能会稍微可读一些。

此方法使用不同的Aggregate重载并避免使用Zip(),但假设您以这样的方式对Method进行编码,以将初始空字符串作为种子元组的一部分进行处理。

        var result = strList.Aggregate(
            Tuple.Create("", true),
            (val, current) => Tuple.Create(current, val.Item2 & Method(val.Item1, current)),
            val => val.Item2);

你可以使用这个.NET Fiddle在工作中看到这一点。它不处理列表中只有一个项目的情况,但接受的答案也不处理。我想我们可以假设它会受到某个地方支票的保护。