- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究迭代器模式,当我偶然发现示例代码中的逻辑时有点困惑
class MonthCollection : IEnumerable
{
public string[] months = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
public IEnumerator GetEnumerator()
{
// Generates values from the collection
foreach (string element in months)
yield return element;
}
}
static void Main()
{
MonthCollection collection = new MonthCollection();
// Consumes values generated from collection's GetEnumerator method
foreach (string n in collection)
Console.Write(n + " ");
Console.WriteLine("\n");
}
在此代码中,将 Array 访问字符串的正常方法是在 foreach 语句中像这样调用 months 变量
MonthCollection collection = new MonthCollection();
foreach(collection.months 中的字符串 n){}
but i could not understand how is the foreach getting access to the collection without even calling the months variable directly
MonthCollection collection = new MonthCollection();
foreach(集合中的字符串 n){}
更新 1
我无法理解的是,如果不在上面的类中这样调用它,我如何访问变量 months
static void Main()
{
MonthCollection collection = new MonthCollection();
// Consumes values generated from collection's GetEnumerator method
foreach (string n in collection.months)
Console.Write(n + " ");
Console.WriteLine("\n");
}
而不是像这样
MonthCollection collection = new MonthCollection();
method
foreach (string n in collection)
Console.Write(n + " ");
Console.WriteLine("\n");
最佳答案
foreach
循环不需要集合,它只需要一个带有 GetEnumerator()
方法并返回 IEnumerator
的对象,它在您的案例带有 IEnumerable
实现。
C# 编译器产生剩余的“魔法”——引用枚举器对象的隐藏临时变量、开始枚举的代码、获取每个项目的代码以及查看枚举何时结束的代码。
在您的情况下,C# 依赖于您的实现来使用另一个“魔术”- yield return
构造来获取 months
数组的内容。此构造使您无需为其编写单独的类即可实现 GetEnumerator()
。该构造被转换为带有状态机的类,让您从循环中间“返回”对象,然后在从迭代器请求下一个项目时重新回到原来的位置。
yield return
返回的对象不必来自集合。您甚至可以将集合中的对象与其他对象混合,例如
public IEnumerator GetEnumerator() {
// Generates values from the collection
foreach (string element in months) {
yield return element + " will start soon!";
yield return element;
yield return element + " has ended.";
}
}
foreach
循环通过实现 GetEnumerator()
的代码间接访问变量 months
。
关于c# - 如何在 C# 的 foreach 循环中调用 GetEnumerator 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328615/
在 .net 框架中,有一个通用的 IEnumerable继承自非泛型 IEnumerable 的接口(interface),并且他们都有 GetEnumerator()方法。这两者之间的唯一区别Ge
致力于实现 IEnumerable 接口(interface)。我实际上找到了两个需要实现的方法: public IEnumerator GetEnumerator() System.Collecti
查看这段代码: public class myWords : IEnumerable { string[] f = "I love you".Split(new string[]{"lo"},
基本上假设您有一些收藏: public class FurCollection : IEnumerable { public IEnumerator GetEnumerator() {
List为什么要定义这三个方法? public Enumerator GetEnumerator() => new Enumerator(this); IEnumera
我对 Reflection.Emit 有疑问。我想要动态创建的类,它具有 ICollection 的简单实现。我定义的所有方法都很好,而不是接下来的两个: public IEnumerator Get
来自 SortedSet.GetEnumerator 文档: This method is an O(1) operation 来自 SortedDictionary.GetEnumerator 文档
我正在编写一个应该能够显示任何数据列表的控件。我想要做的是模仿 for-in 构造,因为我检查包含 Current 属性和 MoveNext 方法的公共(public) GetEnumerator 函
我正在使用 JSOM 查找特定列表中特定项目的特定字段中的值。总的来说,代码查找用户的组成员身份(使用 SPServices),然后使用该值来匹配列表中的项目(列表包含填充有组名称的“Title”字段
我不能重载 GetEnumerator () 吗 IEnumerator IEnumerable.GetEnumerator ( T[] val1,T[] val2) { .... some co
我正在为 C# 开发并发字典实现,我想知道这个 GetEnumerator() 实现是否实际上是(线程)安全的。 它并没有做一个实际的快照,所以我想知道它是否会在以后读/写内部字典时搞砸,或者它是否会
我有一个 BinaryTree类和一个BinaryTreeNode对于持有节点,我已经制作了树并为它编写了前序、后序和中序方法。 但我不知道怎么写IEnumerator为此(我只想对 GetEnume
假设我有一个非常 长的字符串,并且想要获取一个从字符串中间的给定索引处开始的枚举器(为了 LINQ 的优点)。也就是说, var longString = GetLongString(); var i
我想将枚举器用于 Delphi XE2 的通用集合。我想知道,谁拥有函数 GetEnumerator 返回的 TEnumerator (我在文档中没有找到任何明确的答案): 我是否拥有它并需要在使用后
在我们的代码库中,我们有一个数据访问层,提供类似于以下的方法: public IEnumerable GetFoos() { var collection = new Collection()
我真的不明白为什么在这个例子中,这个类定义了两个GetEnumerator方法:一个显式实现接口(interface),另一个隐式 如我所知。那为什么? class FormattedAddresse
我有一个简单的代码,目的是在文件不存在或其中的数据版本已过时时通过文件或数据库返回枚举器。简单的。但是,我正在为该方法的工作原理而苦苦挣扎。原因如下: public override IEnumera
我尝试在 SharePoint 中接收用户子网站的子网站。在第一次调用接收子网站(函数 getSubWebs())时,一切正常:子网站已接收,我可以遍历它们。 但是当我尝试使用相同类型的代码获取这些网
我想在哈希集上使用 foreach,但 VS 不允许。 这是我到目前为止所拥有的: { class Team { private HashSet team; public Team()
我想遍历更新面板的各种控件。在使用控件 ID 进行迭代时,我想删除一些控件。 但我不知道如何使用 GetEnumerator 方法遍历更新面板的控件? 如果我们可以通过其他方式进行迭代,请告诉我。 最
我是一名优秀的程序员,十分优秀!