在这种情况下使用linq矫枉过正

时间:2010-02-03 10:52:48

标签: c# linq

我正在考虑重新考虑因素,但我不知道最终结果是否过度。 目前我有

    IList<myobjecttypebase> m_items;

   public int GetIncrementTotal()
   {
     int incrementTot;
     foreach(myobjecttypebase x in m_items)
     { incrementTot += x.GetIncrement(); }
   }

对于ForEach

使用linq是否有点过分和/或效率低下
m_items.ToList().ForEach(x => incrementTot += x.GetIncrement());

演员阵容是否会成为重要的开销?

6 个答案:

答案 0 :(得分:7)

为什么不直接在IList上使用SUM运算符?

使用Func代理确实有几次重载:

m_items.Sum(x => x.GetIncrement());

答案 1 :(得分:4)

ToList方法是一个与LINQ一起使用的扩展方法,但ForEach方法只是List类中的一个方法。

这里的主要开销是调用ToList方法,该方法从集合中创建一个新的List。 ForEach也有轻微的开销,因为它必须为每个项目调用一个委托。

如果你想使用LINQ方法,聚合方法似乎更合适:

public int GetIncrementTotal() {
  return m_items.Aggregate(0, (t, i) => t + i.GetIncrement());
}

或者总结:

public int GetIncrementTotal() {
  return m_items.Sum(i => i.GetIncrement());
}

要么比原始版本略微增加,所以如果你想要最有效,只需坚持一个简单的循环。

答案 2 :(得分:3)

开销将是两次迭代集合。

m_items.ToList() // First iteration to add to the list all the items
   .ForEach(x => incrementTot += x.GetIncrement()); /* Second iteration to
                                                       perform logic */

ToList 不像大多数LINQ语句那样以惰性方式执行迭代,因此它会强制代码在集合上迭代两次。

一般来说,LINQ表单看起来更好看,但如果你担心性能,最好避免使用它。

答案 3 :(得分:3)

ForEach不是LINQ的一部分 - 它是List<T> API的一部分,自.NET 2.0以来就一直存在。

它不属于LINQ的原因是它是一种自然副作用的方法......并且LINQ不会鼓励副作用。

使用Sum是正确的解决方案,但您不需要先创建列表:

return m_items.Sum(x => x.GetIncrement());

答案 4 :(得分:2)

正如Oded所提到的那样使用SUM

incrementTot = m_items.ToList().Sum(x => x.GetIncrement());

答案 5 :(得分:1)

不要这样做。
ToList()这里将分配并填充一个新列表,恕我直言,没有必要。 虽然编写ForEach扩展方法迭代任何实现IEnumberable的对象是一项微不足道的练习,但我建议不要这样做(请参阅Eric Lippert撰写的这篇文章foreach V's ForEach)。

我会和foreach一起去。

P.S。你需要初始化incrementTot(抱歉,我无法帮助自己)