2011-08-22 54 views

回答

4

由于LINQ确实是一个查询语言,所以我认为它很糟糕样式来查询在评估时会产生次要影响。我个人要么离开的事情会是这样,或者改变它的东西是这样的:

var c = a.Sum(); 
var b = a.ToList(); 
foreach(var item in a) 
{ 
    DoSomething(); 
} 

即使你最终多次迭代的序列,它在每一行代码的一瞥更容易,立即知道它做了什么。

+0

不是'b = a'与'b = a.ToList()'相同吗? – colinfang

+2

否:'b = a'复制引用('a'和'b'现在引用同一个列表),而'b = a.ToList()'创建列表的副本('a'和'b '现在指的是具有相同内容的不同列表)。 – cdhowie

+1

@colinfang:这段代码片断假设'b'是一个新创建的列表,并且由于您将每个项目添加到'a'中,那么您最终将得到与'a'中相同的内容'for'循环的结尾。然而,如果你想让'b'拥有额外的元素,你可以使用其他方法如'Concat','Aggregate'来产生你要去的集合。重点是让你的代码声明。 'b = d.Concat(c).ToList()':“哦,所以'b'是一个包含'd'和'c'内容的列表。 – StriplingWarrior

3

你可以这样做:

var b = a.Select(i => { c += i; dosomething(); return i; }).ToList(); 

注意,这是可能认为是不好的做法。 foreach循环可能更具可读性,因此更易于维护。 (由于没有针对列表中的每个项目执行跳转指针指令,所以它也会更具性能。)

相关问题