我有一个包含n个元素的类,以及一个返回元素的根和平方的属性:
public double Length
{
get
{
double sum = 0.0;
Elements.Select(t => sum += t * t);
return Math.Sqrt(sum);
}
}
然而,这不起作用 - 无论元素的价值如何,总和仍为0.0 为什么这不起作用?
注意:我已经以另一种方式实现了它,但我希望了解上述代码无效的原因
答案 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)