如何解决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# 中的一些数据结构中出现,例如 List
、Set
等。它可以进行迭代。实际上,foreach
在内部使用了它。
foreach
语句是遍历某些数据结构的元素。当以下所有条件都成立时,可以使用 foreach
:
- 该数据结构实现了
IEnumerable
(即 在泛型之前满足遗留代码)或IEnumerable<T>
为某些 输入T
。 - 您不需要知道数据结构中的位置 单个元素。
例如,string
类实现了 IEnumerable
和 IEnumerable<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
返回 Current
时 MoveNext
发生了什么?您能否再次将 false
设置为集合的第一个元素?
如果您不重新实例化新的枚举器,则不会。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。