问题标签 [ienumerator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
873 浏览

.net-2.0 - 如何实现需要重复成员名称的接口?

IEnumerable<T>我经常需要在我的代码中实现一些接口。

每次自动实施时,我都会遇到以下情况:

尽管我必须实现这两个GetEnumerator()方法,但它们不可能具有相同的名称,即使我们知道它们以某种方式执行相同的操作。编译器不能将它们视为另一个的重载,因为只有返回类型不同。

这样做时,我设法将GetEnumerator1()访问器设置为private. 这样,编译器就不会抱怨没有实现接口成员,我只是NotImplementedException在方法的主体中抛出一个。

但是,我想知道这是否是一种好习惯,或者我是否应该以不同的方式进行,可能是方法别名或类似的东西。

在实现这样的接口时,最好的方法是什么IEnumerable<T>,需要实现两个具有相同名称的不同方法?

编辑#1

VB.NET 在实现接口时与 C# 的反应是否不同,因为在 VB.NET 中它是显式实现的,因此强制GetEnumerator1(). 这是代码:

这两种GetEnumerator()方法都是显式实现的,编译将拒绝它们具有相同的名称。为什么?

0 投票
1 回答
7266 浏览

.net - IEnumerator:有一个空的 Dispose 方法是否正常?

我正在编写一个IEnumerator<T>类来迭代我正在包装的COM集合。我注意到extends ,所以我需要实现该方法。 IEnumerator<T>IDisposableDispose

但是,我想不出我会放在那里的任何东西,因为我只有一个对集合的引用(我不希望在 a 的末尾处理它foreach)和一个int索引。将方法留空是否正常Dispose

0 投票
2 回答
6532 浏览

c# - 为什么 BCL 集合使用结构枚举器,而不是类?

我们都知道可变结构通常是邪恶的。我也很确定,因为IEnumerable<T>.GetEnumerator()返回 type IEnumerator<T>,结构会立即被装箱到引用类型中,这比它们一开始只是引用类型的成本要高。

那么,为什么在 BCL 泛型集合中,所有枚举数都是可变结构?肯定有一个很好的理由。我唯一想到的是可以轻松复制结构,从而在任意点保留枚举器状态。但是向接口添加一个Copy()方法IEnumerator会不那么麻烦,所以我不认为这本身就是一个合乎逻辑的理由。

即使我不同意某个设计决定,我也希望能够理解其背后的原因。

0 投票
4 回答
1061 浏览

c# - 使用 IEnumerator 的模式在接口中

IEnumerable<T>我有一个 C# 类,它需要在一堆方法中处理一系列项目( ),所以我不能简单地foreach在一个方法中。我调用.GetEnumerator()并传递它IEnumerator<T>,它在循环单个序列时为我提供了所需的灵活性。

现在我想允许其他人在这个过程中添加逻辑。最自然的方法是给他们一个接口,该接口带有一个接受IEnumerator<T>. 简单,完成,并且有效。

但我担心这是一种反模式。他们必须知道IEnumerator<T>已经.MoveNext()调用过,所以他们可以简单地访问.Current。另外,我没有看到任何IEnumerator<T>在要实现的接口中使用的先例。

  1. 我没有考虑哪些陷阱?
  2. 是否有另一种模式可以让我使用同样有效的机制(即我不希望创建/销毁多个副本)而不暴露IEnumerator<T>自身?

更新:正如我在下面的评论中提到的:我想要的是某种通用的Stream<T>. 我需要能够有效地查看下一项(IEnumerator.Current-> .Peek())并使用它(IEnumerator<T>.MoveNext()-> .Pop())。

我使用IEnumerator<T>它是因为它适合账单界面。我更喜欢在合适的情况下使用常见的 BCL 类型,但似乎我在滥用这种类型。

所以问题3)是否有适合这种需求的课程?还是我应该创建自己的 Stream 懒惰地在IEnumerator<T>内部执行?然后它将被完全封装。我不想使用许多现有的集合,因为它们有内部存储,而我希望存储成为IEnumerable<T>iteslf。


好吧,这听起来像共识是,做IEnumerator<T>往往是一个ValueType以及不知道先验状态的IEnumerator<T>,传递它通常是一个坏主意。

我听到的最好的建议是创建我自己的类,然后传递。还有其他建议吗?

0 投票
1 回答
179 浏览

c# - 这部分代码是如何工作的

UPD。你好,我知道下面的代码是如何工作的。我知道 cross 和 circle 指向 Cross() 和 Circle() 方法。但是我仍然对这部分代码感到困惑。你能给我解释一下吗?


所有代码

0 投票
2 回答
171 浏览

c# - IEnumerator 实现问题

我有这个代码:

当我编译时 - 一切都很好,但是当我调用类时:

我遇到以下问题: http ://screencast.com/t/NDBkNTNkMjkt

任何想法如何解决?

谢谢,德米特里

0 投票
1 回答
292 浏览

c# - 可以使用响应式框架重构此代码吗?

将以下代码复制粘贴到新的 C# 控制台应用程序中。

2 线程 (A,B)

一个线程可以一次提供一个实例并调用Set方法B线程想要接收一系列实例(由线程A提供)

所以从字面上将 Add(item), Add(item), .. 转换为不同线程之间的 IEnumerable

当然也欢迎其他解决方案!

0 投票
3 回答
3984 浏览

c# - IEnumerable 的多个枚举器

我有一个定制的集合,其中有许多对象生成模式。
它可以生成所有内容,一次生成一个对象或一次生成 N 个对象。
我希望可以选择在运行时生成的实现之间切换,甚至可以创建新的实现。
我正在寻找具有这种语法的东西:

我的问题是:
我不知道会EnumerateAs()返回什么?我假设它是 IEnumerator 但它仍然是我列表的枚举器吗?
LazyEnumerator 是否继承自 IEnumerator?
它是如何知道 myCollection 的?

0 投票
3 回答
3299 浏览

c# - 关于 C# 中的 IEnumerator.GetEnumerator 的问题

我有一个关于IEnumerator.GetEnumerator()方法的问题。

当我尝试编译时,错误消息说

“System.Collections.IEnumerator”不包含“GetEnumerator”的定义,并且找不到接受“System.Collections.IEnumerator”类型的第一个参数的扩展方法“GetEnumerator”(您是否缺少 using 指令或程序集引用?)

代码有什么问题吗?

提前致谢


谢谢你们。我得到了它。

0 投票
6 回答
3208 浏览

c# - 如果我只能定义一个 GetEnumerator,为什么还要实现 IEnumerable(T)?

更新:我感谢所有评论,这些评论基本上包括一致反对。虽然提出的每一个反对意见都是有效的,但我认为棺材上的最终钉子是Ani 的敏锐观察,最终,即使这个想法表面上提供的一个 微不足道的好处——消除样板代码——也被以下事实所否定:想法本身将需要自己的样板代码。

所以,是的,请相信我:这将是一个坏主意。

只是为了在某种程度上挽救我的尊严:我可能为了争论而夸大了它,但我从来没有真正相信过这个想法——只是好奇地想听听其他人对此的看法。诚实。


在你认为这个问题很荒谬之前,我要求你考虑以下几点:

  1. IEnumerable<T>继承自 * IEnumerable,这意味着实现的任何类型IEnumerable<T>通常必须同时实现 IEnumerable<T>.GetEnumerator and (explicitly) IEnumerable.GetEnumerator。这基本上相当于样板代码。
  2. 您可以foreach覆盖任何具有GetEnumerator方法的类型,只要该方法返回具有MoveNext方法和Current属性的某种类型的对象。因此,如果您的类型定义了一个带有签名的方法public IEnumerator<T> GetEnumerator(),那么使用 . 枚举它是合法的foreach
  3. 显然,有很多代码需要该IEnumerable<T>接口——例如,基本上所有的 LINQ 扩展方法。幸运的是,使用 C# 通过关键字提供的自动迭代器生成,从一个可以转换为一个类型foreach是微不足道的。IEnumerable<T>yield

所以,把这一切放在一起,我有一个疯狂的想法:如果我只是定义我自己的界面,看起来像这样:

然后,每当我定义一个我想要可枚举的类型时,我都会实现这个接口而不是IEnumerable<T>,从而无需实现两个GetEnumerator方法(一个显式)。例如:

最后,为了使这种类型与需要接口的代码兼容IEnumerable<T>可以定义一个扩展方法来从 anyIForEachable<T>变为IEnumerable<T>like:

在我看来,这样做使我能够设计出在各个方面都可以IEnumerable<T>作为IEnumerable.GetEnumerator.

例如:

大家觉得这个想法怎么样?我错过了为什么这会是一个错误的一些原因吗?

我意识到这可能看起来像是一个过于复杂的解决方案,而不是一开始就没什么大不了的事情(我怀疑是否有人真的那么关心必须显式定义IEnumerable接口);但它只是突然出现在我的脑海中,我没有看到这种方法会带来任何明显的问题。

一般来说,如果我可以一次编写适量的代码,省去多次编写少量代码的麻烦,对我来说,这是值得的。

*这是正确的术语吗?我总是犹豫要不要说一个接口“继承自”另一个接口,因为这似乎不能正确捕捉它们之间的关系。但也许它是正确的。