gpt4 book ai didi

c# - HashSet 枚举器有什么作用?

转载 作者:行者123 更新时间:2023-12-04 07:33:11 25 4
gpt4 key购买 nike

我不习惯写 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# 中的某些数据结构中呈现,例如 List , Set等。它可以通过它进行迭代。实际上,foreach内部使用它。
foreach语句是遍历某些数据结构的元素。一个 foreach当满足以下所有条件时可以使用:

  • 数据结构实现 IEnumerable (这是为了
    在泛型之前满足遗留代码)或IEnumerable<T>对于一些
    类型 T .
  • 您不需要知道数据结构中的位置
    个别元素。

  • 例如, string类同时实现 IEnumerableIEnumerable<Char> . IEnumerable<T>接口(interface)暗示数据结构需要两种方法:
  • public IEnumerator<T> GetEnumerator()
  • IEnumerator IEnumerable.GetEnumerator()

  • 后一种方法是必需的,只是因为 IEnumerable<T>IEnumerable 的子类型,并且该接口(interface)需要 GetEnumerator返回非泛型 IEnumerator 的方法.这两种方法都应该返回相同的对象;因此,因为 IEnumerator<T>也是 IEnumerator 的子类型,这个方法可以简单的调用第一个方法:
    System.Collections.IEnumerator IEnumerable.GetEnumerator()
    {
    return GetEnumerator();
    }
    如您所见, IEnumerable.GetEnumerator()方法返回对另一个名为 System.Collections.IEnumerator 的接口(interface)的引用.此接口(interface)提供了允许调用者遍历 IEnumerable 兼容容器所包含的内部对象的基础结构:
    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方法从 1 增加索引到 10(含),则返回 false .当枚举器处于此位置时,后续调用 MoveNext也返回 false .
    你看到 Current 发生了什么吗?当 MoveNext返回 false ?可以设置 Current再次到集合的第一个元素?
    如果您不重新实例化新的枚举器,则不会。

    关于c# - HashSet 枚举器有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67859912/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com