18

我已经看遍了,但无法弄清楚这一点。你如何总结 BigIntegers 的列表?

Using System.Numerics;
Using System.Linq;

List<BigInteger> bigInts = new List<BigInteger>();
BigInteger sum = bigInts.Sum();             // doesn't work
BigInteger sum = bigInts.Sum<BigInteger>(); // doesn't work
BigInteger sum = bigInts.Sum(x => x);       // doesn't work

你必须这样做吗?

BigInteger sum = new BigInteger(0);
foreach(BigInteger bigint in bigInts)
    sum += bigint;
4

4 回答 4

16
var sum = bigInts.Aggregate(BigInteger.Add);

Aggregate 获得一个方法的委托,该方法获得两个 BigInteger 并返回一个 BigInteger。它使用默认的 BigInteger 作为初始值 (0),并遍历每个 BigInteger,调用 BigInteger.Add 和先前的结果(0 将是第一次的先前结果 - 也称为“种子”)和当前元素。

于 2012-04-21T05:20:19.270 回答
12

聚合函数是 Sum 的更通用版本:

var bigInts = new List<System.Numerics.BigInteger>(); 
bigInts.Add(new System.Numerics.BigInteger(1));

var result = bigInts.Aggregate((currentSum, item)=> currentSum + item));
于 2012-04-21T05:02:00.743 回答
1

您还可以在通用列表上使用ForEach()方法进行添加:

var bigInts = new List<BigInteger>();

BigInteger sum = 0;
bigInts.ForEach(x => sum += x);
于 2012-04-21T05:14:41.313 回答
0

正如阿列克谢所说,聚合是总和中更一般的。下面介绍一种扩展方法。

public BigInteger static Sum(IEnumerable<BigInteger> this lst)
{
    return lst.Aggregate(BigInteger.Zero, (acc, next)=> acc.Add(next));
}

我还没有测试过这个,我的 C# 可能有点生锈了。但这个想法应该是合理的:见http://msdn.microsoft.com/en-us/library/bb549218.aspx#Y0

于 2012-04-21T05:12:37.617 回答