问题标签 [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.
.net-2.0 - 如何实现需要重复成员名称的接口?
IEnumerable<T>
我经常需要在我的代码中实现一些接口。
每次自动实施时,我都会遇到以下情况:
尽管我必须实现这两个GetEnumerator()方法,但它们不可能具有相同的名称,即使我们知道它们以某种方式执行相同的操作。编译器不能将它们视为另一个的重载,因为只有返回类型不同。
这样做时,我设法将GetEnumerator1()
访问器设置为private
. 这样,编译器就不会抱怨没有实现接口成员,我只是NotImplementedException
在方法的主体中抛出一个。
但是,我想知道这是否是一种好习惯,或者我是否应该以不同的方式进行,可能是方法别名或类似的东西。
在实现这样的接口时,最好的方法是什么
IEnumerable<T>
,需要实现两个具有相同名称的不同方法?
编辑#1
VB.NET 在实现接口时与 C# 的反应是否不同,因为在 VB.NET 中它是显式实现的,因此强制
GetEnumerator1()
. 这是代码:
这两种GetEnumerator()
方法都是显式实现的,编译将拒绝它们具有相同的名称。为什么?
.net - IEnumerator:有一个空的 Dispose 方法是否正常?
我正在编写一个IEnumerator<T>
类来迭代我正在包装的COM集合。我注意到extends ,所以我需要实现该方法。 IEnumerator<T>
IDisposable
Dispose
但是,我想不出我会放在那里的任何东西,因为我只有一个对集合的引用(我不希望在 a 的末尾处理它foreach
)和一个int
索引。将方法留空是否正常Dispose
?
c# - 为什么 BCL 集合使用结构枚举器,而不是类?
我们都知道可变结构通常是邪恶的。我也很确定,因为IEnumerable<T>.GetEnumerator()
返回 type IEnumerator<T>
,结构会立即被装箱到引用类型中,这比它们一开始只是引用类型的成本要高。
那么,为什么在 BCL 泛型集合中,所有枚举数都是可变结构?肯定有一个很好的理由。我唯一想到的是可以轻松复制结构,从而在任意点保留枚举器状态。但是向接口添加一个Copy()
方法IEnumerator
会不那么麻烦,所以我不认为这本身就是一个合乎逻辑的理由。
即使我不同意某个设计决定,我也希望能够理解其背后的原因。
c# - 使用 IEnumerator 的模式在接口中
IEnumerable<T>
我有一个 C# 类,它需要在一堆方法中处理一系列项目( ),所以我不能简单地foreach
在一个方法中。我调用.GetEnumerator()
并传递它IEnumerator<T>
,它在循环单个序列时为我提供了所需的灵活性。
现在我想允许其他人在这个过程中添加逻辑。最自然的方法是给他们一个接口,该接口带有一个接受IEnumerator<T>
. 简单,完成,并且有效。
但我担心这是一种反模式。他们必须知道IEnumerator<T>
已经.MoveNext()
调用过,所以他们可以简单地访问.Current
。另外,我没有看到任何IEnumerator<T>
在要实现的接口中使用的先例。
- 我没有考虑哪些陷阱?
- 是否有另一种模式可以让我使用同样有效的机制(即我不希望创建/销毁多个副本)而不暴露
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>
,传递它通常是一个坏主意。
我听到的最好的建议是创建我自己的类,然后传递。还有其他建议吗?
c# - 这部分代码是如何工作的
UPD。你好,我知道下面的代码是如何工作的。我知道 cross 和 circle 指向 Cross() 和 Circle() 方法。但是我仍然对这部分代码感到困惑。你能给我解释一下吗?
所有代码
c# - 可以使用响应式框架重构此代码吗?
将以下代码复制粘贴到新的 C# 控制台应用程序中。
2 线程 (A,B)
一个线程可以一次提供一个实例并调用Set方法B线程想要接收一系列实例(由线程A提供)
所以从字面上将 Add(item), Add(item), .. 转换为不同线程之间的 IEnumerable
当然也欢迎其他解决方案!
c# - IEnumerable 的多个枚举器
我有一个定制的集合,其中有许多对象生成模式。
它可以生成所有内容,一次生成一个对象或一次生成 N 个对象。
我希望可以选择在运行时生成的实现之间切换,甚至可以创建新的实现。
我正在寻找具有这种语法的东西:
我的问题是:
我不知道会EnumerateAs()
返回什么?我假设它是 IEnumerator 但它仍然是我列表的枚举器吗?
LazyEnumerator 是否继承自 IEnumerator?
它是如何知道 myCollection 的?
c# - 关于 C# 中的 IEnumerator.GetEnumerator 的问题
我有一个关于IEnumerator.GetEnumerator()
方法的问题。
当我尝试编译时,错误消息说
“System.Collections.IEnumerator”不包含“GetEnumerator”的定义,并且找不到接受“System.Collections.IEnumerator”类型的第一个参数的扩展方法“GetEnumerator”(您是否缺少 using 指令或程序集引用?)
代码有什么问题吗?
提前致谢
谢谢你们。我得到了它。
c# - 如果我只能定义一个 GetEnumerator,为什么还要实现 IEnumerable(T)?
更新:我感谢所有评论,这些评论基本上包括一致反对。虽然提出的每一个反对意见都是有效的,但我认为棺材上的最终钉子是Ani 的敏锐观察,最终,即使这个想法表面上提供的一个 微不足道的好处——消除样板代码——也被以下事实所否定:想法本身将需要自己的样板代码。
所以,是的,请相信我:这将是一个坏主意。
只是为了在某种程度上挽救我的尊严:我可能为了争论而夸大了它,但我从来没有真正相信过这个想法——只是好奇地想听听其他人对此的看法。诚实。
在你认为这个问题很荒谬之前,我要求你考虑以下几点:
IEnumerable<T>
继承自 *IEnumerable
,这意味着实现的任何类型IEnumerable<T>
通常必须同时实现IEnumerable<T>.GetEnumerator
and (explicitly)IEnumerable.GetEnumerator
。这基本上相当于样板代码。- 您可以
foreach
覆盖任何具有GetEnumerator
方法的类型,只要该方法返回具有MoveNext
方法和Current
属性的某种类型的对象。因此,如果您的类型定义了一个带有签名的方法public IEnumerator<T> GetEnumerator()
,那么使用 . 枚举它是合法的foreach
。 - 显然,有很多代码需要该
IEnumerable<T>
接口——例如,基本上所有的 LINQ 扩展方法。幸运的是,使用 C# 通过关键字提供的自动迭代器生成,从一个可以转换为一个类型foreach
是微不足道的。IEnumerable<T>
yield
所以,把这一切放在一起,我有一个疯狂的想法:如果我只是定义我自己的界面,看起来像这样:
然后,每当我定义一个我想要可枚举的类型时,我都会实现这个接口而不是IEnumerable<T>
,从而无需实现两个GetEnumerator
方法(一个显式)。例如:
最后,为了使这种类型与需要接口的代码兼容,我IEnumerable<T>
可以定义一个扩展方法来从 anyIForEachable<T>
变为IEnumerable<T>
like:
在我看来,这样做使我能够设计出在各个方面都可以IEnumerable<T>
作为IEnumerable.GetEnumerator
.
例如:
大家觉得这个想法怎么样?我错过了为什么这会是一个错误的一些原因吗?
我意识到这可能看起来像是一个过于复杂的解决方案,而不是一开始就没什么大不了的事情(我怀疑是否有人真的那么关心必须显式定义IEnumerable
接口);但它只是突然出现在我的脑海中,我没有看到这种方法会带来任何明显的问题。
一般来说,如果我可以一次编写适量的代码,省去多次编写少量代码的麻烦,对我来说,这是值得的。
*这是正确的术语吗?我总是犹豫要不要说一个接口“继承自”另一个接口,因为这似乎不能正确捕捉它们之间的关系。但也许它是正确的。