我注意到Java的Iterator(接口)类似于C#IEnumerable,但有没有办法像这样使用它:
private IEnumerable<Label> it;
it = labels.iterator();
Run Code Online (Sandbox Code Playgroud)
在Java中,我可以这样做:
private Iterator<JLabel> it;
it = labels.iterator();
Run Code Online (Sandbox Code Playgroud)
什么是Java的Iterator接口的C#等价物?
Bar*_*zKP 10
它不经常使用,但类比是IEnumerator<T>界面:
var enumerator = labels.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)
.NET IEnumerator与Java 的不同之处Iterator如下:
Iterator构造后指向集合的第一个元素(或者,对于空集合,无效并将立即hasNext返回false),IEnumerator最初在集合的第一个元素之前的点(对于空集合MoveNext将返回false)Iterator有hasNext方法,而IEnumerator你验证MoveNext方法的结果Iterator有next方法,而IEnumerator你也使用MoveNextIterator的next返回的下一个元素,同时与IEnumerator您使用Current调用后财产MoveNextIteratorJava中的remove方法允许您从基础集合中删除元素.没有相应的IEnumerator因此,对于Java,您将使用以下内容进行迭代:
it = labels.iterator();
while (it.hasNext())
{
elem = it.next();
}
Run Code Online (Sandbox Code Playgroud)
在C#中:
en = labels.GetEnumerator();
while (en.MoveNext())
{
elem = en.Current;
}
Run Code Online (Sandbox Code Playgroud)
通常,labels作为集合(总是实现IEnumerable<T>),您只需直接使用它:
foreach (var label in labels)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以存储IEnumerable<T>以供以后使用(参考您的示例的名称):
IEnumerable<Label> it = labels;
Run Code Online (Sandbox Code Playgroud)
当心,这IEnumerable<T>很懒,就像Iterator在Java中一样.
您还可以轻松获取此类集合的快照(同样,请it参考您的示例,可以选择更好的名称):
IEnumerable<Label> it = labels.ToArray();
// or Label[] it = labels.ToArray();
// or better: var it = labels.ToArray();
Run Code Online (Sandbox Code Playgroud)