Chr*_*ris 4 .net c# enumeration
我希望我不要因为问这么基本的东西而受到抨击.我可以通过Google获得答案,但我希望听到一些不是来自教科书的内容.
我正在编写一个单元测试来验证我的IDictionary密钥是顺序的.
由于Keys属性是一个ICollection<T>,我想枚举集合并将Key值打印到控制台.
尝试使用简单for循环打印Key值时:
for (int i = 0; i < unPivotedData.Count; i++)
{
Console.WriteLine(unPivotedData.Keys[i]);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.ICollection<int>'
Run Code Online (Sandbox Code Playgroud)
但是,当我使用foreach循环时:
foreach(int key in unPivotedData.Keys)
{
Console.WriteLine(key);
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.
我理解索引器的作用以及它是如何实现的,但它是如何foreach工作的?我不明白是怎么foreach能工作,并能在for编译错误的结果.
我在这里错过了Enumeration的基础吗?
干杯!
编辑:此外,两者之间是否存在性能差异?我知道我不能使用forIDictionary,但如果我使用IList,我可以.for移动速度是否快于foreach或者性能增益可以忽略不计
foreach只是需要IEnumerable; 而for(a,b,c)(在您的情况下)需要索引器属性.
当你调用foreach一个实现的对象时,IEnumerable它调用它GetEnumerator(),它返回一个IEnumerator对象.该对象实现了一些像MoveNext()和的成员Current.它的每次迭代foreach实际上都是调用MoveNext(),true如果枚举器可以向前移动则返回,如果不能(到达终点),则返回false.
这里的关键是,它实现了一个对象IEnumerable不知道有多少项目了,这个项目时,该指数是对等,所有它知道的是,它可以前进到下一个项目,返回作为当前项目,直到它耗尽了物品.
一for(a,b,c)环,而另一方面,将从根本上永远循环下去-也就是说,它不会被收集的限制,你可能碰巧遍历(虽然在实践中通常是这样).在最基本的级别,它C每次执行一次,并检查是否B为真.如果B是真的,它将再次循环.如果它是假的,它将停止.每次循环时,你可能正在调用循环object[number],如果你的对象没有这样的属性,那么当然会失败.
这里的关键是带有索引器的对象支持随机访问 - 这意味着您可以随时调用[arbitrary index]并抓取该对象.与此对比IEnumerable,再次只能访问当前项目.
| 归档时间: |
|
| 查看次数: |
6791 次 |
| 最近记录: |