2

我有一个包含 n 个元素的类,以及一个返回元素的平方根的属性:

public double Length 
{ 
    get 
    { 
        double sum = 0.0; 
        Elements.Select(t => sum += t * t);  
        return Math.Sqrt(sum); 
    } 
}

但是,这不起作用 - 无论元素的值如何,总和都保持为 0.0。
为什么这不起作用?

注意:我已经以另一种方式实现了它,但我想了解为什么上面的代码不起作用

4

3 回答 3

7

LINQ 使用延迟执行- Select 方法不会立即为所有元素执行 lambda,而是返回一个IEnumerable<T>,它在执行时会在每个元素被枚举时执行 lambda。

另请注意,LINQ 用于查询,而不是为每个元素执行代码块。您应该编写代码,使得 lambda 中没有语句,只有一个没有副作用的表达式。当您尝试计算总和时,您可以使用Sum 方法:

public double Length 
{ 
    get 
    { 
        double sum = elements.Select(t => t * t).Sum();
        return Math.Sqrt(sum); 
    } 
}

或者

public double Length 
{ 
    get 
    { 
        double sum = elements.Sum(t => t * t);
        return Math.Sqrt(sum); 
    } 
}
于 2012-07-02T02:00:23.757 回答
3

延期执行。

试试这个:

public double Length
{
    get { return Math.Sqrt(Elements.Sum(t => t * t)); }
}

这里 linq 查询立即执行。

于 2012-07-02T01:57:38.657 回答
0

这不起作用,因为延迟执行。你可以阅读这个

LINQ 和延迟执行

了解 LINQ 的延迟执行

于 2012-07-02T02:08:49.303 回答