作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不习惯写 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>
接口(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/
我是一名优秀的程序员,十分优秀!