迭代IEnumerable最好的方法

本文关键字:方法 IEnumerable 迭代 | 更新日期: 2023-09-27 18:03:50

期待方法的实现

void InsertRange(int index, IEnumerable<T> collection)
List<>类中的

. 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>IDisposable实现强制执行的Dispose方法。

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

除了简单的样式偏好之外,还有什么理由更喜欢一种语法而不是另一种语法吗?

迭代IEnumerable<T>最好的方法

foreach是推荐的方法,因为您不需要指定如何遍历枚举的详细信息。而且,您编写的代码更少,可读性更强。

它们完全相等,这就是所谓的语法糖。使用foreach的唯一原因是因为它更短,更不容易出错,更可读等。

您可以在MSDN上查看foreach实现的文章

for循环比foreach循环快。但现在差别已经很小了,所以通常不值得考虑。

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

考虑这个例子:

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

它基本上是一种高级的迭代IEnumerable<T>,如果枚举数实现了iDisposable,则foreach语句使用using语句,并隐式地释放枚举数对象。

在底层,我们可以这样写:

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

所以foreach为你做了工作,你不必像上面那样写来枚举IEnumeable<T>

相关文章: