我注意到 Java 的 Iterator
(接口(interface))类似于 C# 的 IEnumerable
,但是有没有办法像这样使用它:
private IEnumerable<Label> it;
it = labels.iterator();
在 Java 中我可以这样做:
private Iterator<JLabel> it;
it = labels.iterator();
Java 的 Iterator
接口(interface)在 C# 中的等效项是什么?
最佳答案
它不经常使用,但类比是 IEnumerator<T>
界面:
var enumerator = labels.GetEnumerator();
.NET 的 IEnumerator
不同于 Java 的 Iterator
具有以下内容:
-
Iterator
构造指向集合的第一个元素后(或者,对于空集合,无效并且hasNext
将立即返回false
),IEnumerator
最初指向集合的第一个元素之前(对于空集合MoveNext
将返回false
) -
Iterator
有hasNext
方法,而对于IEnumerator
您验证MoveNext
的结果方法 -
Iterator
有next
方法,而对于IEnumerator
你也用MoveNext
-
Iterator
的next
返回下一个元素,同时使用IEnumerator
你用Current
调用后属性MoveNext
-
Iterator
在 Java 中有remove
允许您从基础集合中删除元素的方法。IEnumerator
中没有等效项
所以对于 Java,你会用这样的东西迭代:
it = labels.iterator();
while (it.hasNext())
{
elem = it.next();
}
在 C# 中:
en = labels.GetEnumerator();
while (en.MoveNext())
{
elem = en.Current;
}
通常,有 labels
作为一个集合(始终实现 IEnumerable<T>
),您只需直接使用它:
foreach (var label in labels)
{
//...
}
当然,您可以存储 IEnumerable<T>
供以后使用(名称指的是您的示例):
IEnumerable<Label> it = labels;
当心,IEnumerable<T>
很懒惰,就像Iterator
在 Java 中。
您还可以像这样轻松获取集合的快照(同样,it
指的是您的示例,可以选择更好的名称):
IEnumerable<Label> it = labels.ToArray();
// or Label[] it = labels.ToArray();
// or better: var it = labels.ToArray();
关于c# - Java 迭代器与 C# IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991193/