Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可枚举。聚合错误_C#_.net_Linq_Linq To Objects - Fatal编程技术网

C# 可枚举。聚合错误

C# 可枚举。聚合错误,c#,.net,linq,linq-to-objects,C#,.net,Linq,Linq To Objects,在将带有唯一元素的sequentce传递给该函数之前,一切都正常工作。最简单的复制方法是: var sumOfSquares = Enumerable.Range(5, 1).Aggregate((s, i) => s + i*i); // sumOfSquares == 5 我认为这个版本的聚合应该抛出一个异常,以防序列只包含一个元素。 我是对的还是我遗漏了一些细节?这不应该失败。根据报告: 源的第一个元素用作初始聚合值 因此,在本例中,您只返回第一个元素(5),而不执行聚合。没有错误

在将带有唯一元素的sequentce传递给该函数之前,一切都正常工作。最简单的复制方法是:

var sumOfSquares = Enumerable.Range(5, 1).Aggregate((s, i) => s + i*i);
// sumOfSquares == 5
我认为这个版本的聚合应该抛出一个异常,以防序列只包含一个元素。
我是对的还是我遗漏了一些细节?

这不应该失败。根据报告:

源的第一个元素用作初始聚合值

因此,在本例中,您只返回第一个元素(5),而不执行聚合。没有错误

正如Anthony Pegram指出的,您可以在这里为聚合指定种子值。将seed设置为0会得到答案25,这可能是您想要的结果

var sumOfSquares = Enumerable.Range(5, 1).Aggregate(0, (s, i) => s + i * i);
当然,这里不应该使用聚合,而是可以使用总和

var sumOfSquares = Enumerable.Range(5, 1).Sum(i => i * i);

我想这只是一个简单的例子。

为什么要这么做?取一个数的和是完全正确的

此外,为了避免异常,调用方需要执行以下操作:

public double MySum(IEnumerable<double> seq) {
    switch (seq.Count()) {
        case 0: return 0.0;
        case 1: return seq.First();
        default: return seq.Aggregate((s, i) => s + i);
    }
}
public double MySum(IEnumerable seq){
开关(seq.Count()){
案例0:返回0.0;
案例1:返回seq.First();
默认值:返回序列聚合((s,i)=>s+i);
}
}

大量调用,也需要通过序列两次(或至少前两个元素)。

还有另一个重载,您可以提供适当的种子并获得我认为是您想要的结果

var sumOfSquares = Enumerable.Range(5, 1).Aggregate(0, (s, i) => s + i * i);

在此代码中,0是初始种子,
s
是累积值,
i
是当前项。这将生成值25
(5,2)
产生61,
(5,3)
产生110,等等。

如果您不提供种子(请参阅Anthony Pegram的答案,以获得一个极好的示例),那么
聚合
函数对只有一个项的IEnumerable几乎没有任何作用。序列中的第一个元素成为种子,如果IEnumerable中没有其他项,它将做什么?因此,在没有指定种子的情况下,
Aggregate
函数将返回第一个元素的值。您可以在使用以下编译和运行的代码时真正看到它:

var c = 0;
var result = Enumerable.Range(5,1).Aggregate((acc,x) => acc + (x / c));
//result == 5
将其更改为
Enumerable.Range(5,2)
,它会立即抛出一个“除以零”错误


参考:在“备注”部分

实际上答案是0+5*5=25@juharr例如我以前的回答是错的。在查看文档后,我对其进行了更新。@Mark Byers:不太好,或多或少地复制了Anthony Pegrams的答案。@VVS,本着提供完整答案的精神,它是非常好的。在本例中,他提供了观察到的行为的原因,并添加了获得所需行为的信息。如果马克的答案是(a)得票最高的答案或(b)被接受的答案,那么它将跃居榜首。通过合并我的答案中的元素,它使它更完整,对后续的观众更有用。实际上,为了得到正确的结果,此方法只能用于具有2个或更多结果的序列。所以,我认为这有点误导,因为它有“不安全”的行为……马克在我发布我的答案前40秒更新了他的答案……这就是生活^_^事实上,MSDN应该告诉我们这样的事情:“这个方法的工作原理是对源代码中的每个元素调用func一次,除非序列中有一个或零个元素。”@Mad Hollander同意。他们当然可以更清楚地了解函数的“特殊情况”。想象一下,您已经创建了一个聚合函数并将其传递给聚合<代码>序列。聚合(SomeFunction)并且对于1个项目长度,所有工作正常。然后,在示例中,在几天后您修改了SomeFunction。你该怎么办?由于聚合,您必须找到对某个函数的所有引用并修复它们。