微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HashSet 枚举器有什么作用?

如何解决HashSet 枚举器有什么作用?

我不习惯写 C# 代码,只会写 Java 和 Python。 现在我找到了一些仅在 C# 中可用的算法的代码示例。 有一种结构我不明白,它是枚举器。

HashSet<Node>.Enumerator enumerator = hashSet.GetEnumerator();
enumerator.MoveNext();
Item next = enumerator.Current;

所以 Item 是存储在 HashSet hashSet 中的数据类型。这是否等于在 HashSet 上迭代的 for 循环或者如何将其转换为 python 或 java?

解决方法

GetEnumerator() 方法在 C# 中的一些数据结构中出现,例如 ListSet 等。它可以进行迭代。实际上,foreach 在内部使用了它。


foreach 语句是遍历某些数据结构的元素。当以下所有条件都成立时,可以使用 foreach

  • 该数据结构实现了 IEnumerable(即 在泛型之前满足遗留代码)或 IEnumerable<T> 为某些 输入 T
  • 您不需要知道数据结构中的位置 单个元素。

例如,string 类实现了 IEnumerableIEnumerable<Char>

IEnumerable<T> 接口暗示数据结构需要两种方法:

  • public IEnumerator<T> GetEnumerator()
  • IEnumerator IEnumerable.GetEnumerator()

后一种方法是必需的,因为 IEnumerable<T>IEnumerable 的子类型,并且该接口需要一个 GetEnumerator 方法,该方法返回一个非泛型 { {1}}。这两个方法都应该返回相同的对象;因此,因为 IEnumerator 也是 IEnumerator<T> 的子类型,所以这个方法可以简单地调用第一个方法:

IEnumerator

如您所见,System.Collections.IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } 方法返回对另一个名为 IEnumerable.GetEnumerator() 的接口的引用。此接口提供基础结构以允许调用者遍历 IEnumerable 兼容容器包含的内部对象:

System.Collections.IEnumerator

让我们举例说明。

public interface IEnumerator
{
   bool MoveNext (); // Advance the internal position of the cursor.
   object Current { get;} // Get the current item (read-only property).
   void Reset (); // Reset the cursor before the first member.
}

public class PowersOfThree : IEnumerable<int> { public IEnumerator<int> GetEnumerator() { return new PowersOfThreeEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } internal class PowersOfThreeEnumerator : IEnumerator<int> { private int index = 0; public int Current { get { return (int)System.Math.Pow(3,index); } } object System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { index++; if (index > 10) return false; else return true; } public void Reset() { index = 0; } public void Dispose() { } } public class Test { public static void Main(string[] str) { var p2 = new PowersOfThree(); foreach (int p in p2) { System.Console.WriteLine(p); } } } 方法返回相同的元素,直到调用 Current 方法。初始索引为 MoveNext,每个 0 方法将索引从 MoveNext 增加到 10,包括在内,然后返回 1。当枚举器位于此位置时,对 false 的后续调用也会返回 MoveNext

您是否看到 false 返回 CurrentMoveNext 发生了什么?您能否再次将 false 设置为集合的第一个元素? 如果您不重新实例化新的枚举器,则不会。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。