迭代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
不是原因,这是我的问题。
除了简单的样式偏好之外,还有什么理由更喜欢一种语法而不是另一种语法吗?
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>