C#选择查询不修改外部变量

时间:2012-07-02 01:53:53

标签: c# linq

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

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

然而,这不起作用 - 无论元素的价值如何,总和仍为0.0 为什么这不起作用?

注意:我已经以另一种方式实现了它,但我希望了解上述代码无效的原因

3 个答案:

答案 0 :(得分:7)

LINQ使用deferred execution - Select Method不立即对所有元素执行lambda,但返回IEnumerable<T>,执行时,将每个元素的lambda执行为它列举了。

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

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

答案 1 :(得分:3)

延期执行。

试试这个:

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

此处立即执行linq查询。

答案 2 :(得分:0)

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

LINQ and Deferred Execution

Understanding LINQ's Deferred Execution