如果我没记错的话,Linq的.Aggregate就像其他语言中的reduce()一样,不是吗?

无论如何,我正在尝试:

var tags = new[] { "a", "b", "c", ... };
tag.Rule = tags.Aggregate((x, y) => ToTerm(x) | y);


但这不会编译,因为我的lambda的返回类型必须是字符串。那么我怎样才能使它工作呢?

我知道它看起来很有趣,因为它的类型(这将成为反讽语法),但是您真正需要知道的是ToTerm()返回一个KeyTerm,并且KeyTerms可以或可以一起构成一个BnfExpression,这是tag.Rule所期望的。

最佳答案

您正在调用Aggregate<TSource>(IEnumerable<TSource>, Func<TSource, TSource, TSource>)重载,该重载将序列中的第一个值用作初始累加器值。

如果希望累加器的类型与序列中的元素不同,则需要自己指定初始累加器值:

tag.Rule = tags.Aggregate(BnfExpression.Empty, (x, y) => ToTerm(x) | y);

关于c# - 如何通过将所有元素加或在一起来简化列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4987878/

10-11 15:16