迭代IEnumerable <t>。最好的办法?

时间:2015-07-20 16:16:02

标签: c#

展望method

的实施
void InsertRange(int index, IEnumerable<T> collection)
列表中的

&lt;&gt; class(.NET Framework 4.5.2),我可以看到像这样的集合的迭代

using(IEnumerator<T> en = collection.GetEnumerator()) {
    while(en.MoveNext()) {
        Insert(index++, en.Current);                                    
    }                
}

我想知道在这一个

上更喜欢这种语法的原因是什么
foreach(var item in collection)
{
    Insert(index++, item)
}

我使用不同的方法创建了一个包含两个方法的程序集。然后,查看生成的IL代码,我可以看到两个方法调用由IEnumerator<T>的实现强制执行的Dispose方法,因此IDisposable

所以IDisposable不是原因,这是我的问题。

除了简单的样式(ish)首选项之外,是否有理由更喜欢一种语法而不是另一种语法?

4 个答案:

答案 0 :(得分:5)

foreach是推荐的方式,因为您没有指定有关如何迭代枚举的详细信息。此外,您编写的代码更少,而且更具可读性。

答案 1 :(得分:3)

它们完全等同,它是一种叫做 syntactic sugar 的东西。使用foreach的唯一原因是因为它更短,更不容易出错,更具可读性等。

您可以查看有关MSDNforeach实施的文章。

答案 2 :(得分:0)

for循环比foreach循环更快。现在差异很小,所以通常甚至都不值得考虑。我认为.net的早期版本存在更大的差异。

答案 3 :(得分:0)

任何继承自IEnumerable<T>(可枚举对象)的集合都可以使用foreach循环进行枚举。

考虑这个例子:

foreach(char c in "Ehsan")
{
    Console.WriteLine(c);
}

基本上是一种迭代IEnumerable<T>的高级方法,如果枚举器实现iDisposableforeach语句使用using语句,它将勉强地处理枚举器对象

在较低的水平,我们可以做到:

using(var enumerator = "Ehsan".GetEnumerator())
{
    while(enumerator.MoveNext())
    {
       var element = enumerator.Current;
       Console.WriteLine(element);
    }

}

所以foreach正在为你工作,你不必像上面这样写一下来枚举IEnumeable<T>