c# - Java 迭代器与 C# IEnumerable

标签 c# java iterator

我注意到 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)
  • IteratorhasNext方法,而对于 IEnumerator您验证 MoveNext 的结果方法
  • Iteratornext方法,而对于 IEnumerator你也用 MoveNext
  • Iteratornext返回下一个元素,同时使用 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/

相关文章:

java - 为 HashMap 实现迭代器下一个方法 - 如何实现?

c++ - 将 vector 迭代器传递给模板函数

c# - 在 DesignMode 中编辑集合的最简单方法?

c# - 如何访问通用存储库类中的 DbContext.Entry<TEntity> 方法 (TEntity)?

java - 将 token 映射到枚举值的更好方法?

java - 来自映射 : expected org. apache.hadoop.io.IntWritable 的键类型不匹配,收到 org.apache.hadoop.io.LongWritable

java - 监控输入流/httpclient.execute 的进度

C# 分隔符不显示

c# - Winforms 中的 CheckedListbox 奇怪行为

c++ - 迭代器指针不引用第一个元素