编辑其他选项和下面稍微扩展的问题.
考虑一个类体的这个人为的抽象例子.它演示了执行“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命名空间.