编辑 下面有附加选项和略微扩展的问题。
考虑这个虚构的、抽象的类体例子。它展示了四种不同的执行“for”迭代的方式。
private abstract class SomeClass
{
public void someAction();
}
void Examples()
{
List<SomeClass> someList = new List<SomeClass>();
//A. for
for (int i = 0; i < someList.Count(); i++)
{
someList[i].someAction();
}
//B. foreach
foreach (SomeClass o in someList)
{
o.someAction();
}
//C. foreach extension
someList.ForEach(o => o.someAction());
//D. plinq
someList.AsParallel().ForAll(o => o.someAction());
编辑: 根据答案和研究,添加了一些选项。 //E. ParallelEnumerable
ParallelEnumerable.Range(0, someList.Count - 1)
.ForAll(i => someList[i].someAction());
//F. ForEach Parallel Extension
Parallel.ForEach(someList, o => o.someAction());
//G. For Parallel Extension
Parallel.For(0, someList.Count - 1, i => someList[i].someAction())
}
我的问题分为两部分。我有没有错过一些重要的选项?在可读性和主要性能方面,哪个选项是最佳选择?
请指出 SomeClass
实现的复杂性或 someList
的 Count
是否会影响此选择。
编辑: 由于选项太多,我不想让我的代码被选择所破坏。为了添加问题的第三部分,如果我的列表长度可以是任意长度,我应该默认使用并行选项吗?
作为一个支持的论据。我怀疑对于所有 SomeClass
实现和所有长度的 someList
,选项 //E. ParallelEnumerable
将提供最佳的平均性能,因为多处理器架构普遍存在。我没有进行任何测试来证明这一点。
注意:并行扩展将需要使用 System.Threading.Tasks
命名空间。