我正在考虑重新考虑因素,但我不知道最终结果是否过度。 目前我有
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());
演员阵容是否会成为重要的开销?
答案 0 :(得分:7)
答案 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(抱歉,我无法帮助自己)