问题标签 [enumerator]
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.
c# - 在 C# 中修改集合的模式是什么
此类问题的模式(最佳实践)是什么——修改集合中的元素(值)?
条件:
- 集合的大小没有改变(没有元素被删除或添加)
- 修改就地
在 C++ 中它既简单又好用,我只是迭代了一个集合并更改了元素。但是在 C# 中迭代(使用枚举器)是只读操作(就 C++ 而言,只有 const_iterator 可用)。
那么,如何在 C# 中做到这一点?
示例:具有“1,2,3,4”修改序列将其更改为“1,2,8,9”但不是“1,2,3”或“1,2,3,4,5”。
c# - 同步 IEnumerator
我正在组合一个自定义SynchronizedCollection<T>
类,以便我可以为我的 WPF 应用程序拥有一个同步的 Observable 集合。同步是通过 ReaderWriterLockSlim 提供的,在大多数情况下,它很容易应用。我遇到麻烦的情况是如何提供集合的线程安全枚举。我创建了一个自定义IEnumerator<T>
嵌套类,如下所示:
然而,我担心的是,如果 Enumerator 没有被 Disposed,锁将永远不会被释放。在大多数用例中,这不是问题,因为 foreach 应该正确调用 Dispose。但是,如果消费者检索显式 Enumerator 实例,则可能会出现问题。如果明确使用枚举器,我唯一的选择是使用警告实现者来记录类,提醒消费者调用 Dispose,还是有办法在最终确定期间安全地释放锁?我不这么认为,因为终结器甚至不在同一个线程上运行,但我很好奇是否还有其他方法可以改进这一点。
编辑
在考虑了这一点并阅读了回复(特别感谢 Hans)之后,我认为这绝对是一个坏主意。最大的问题其实不是忘记 Dispose,而是一个悠闲的消费者在枚举的时候制造了死锁。我现在只读取足够长的时间来获取副本并返回副本的枚举器。
delphi - Delphi:使用枚举器过滤 TList按班级类型?
好吧,这可能会令人困惑。我想要做的是使用枚举器只返回基于类类型的通用列表中的某些项目。
给定以下层次结构:
如何扩展TShapeList
以便我可以执行类似于以下的操作:
我尝试使用工厂记录在参数化枚举TShapeList
器上使用Primoz Gabrijelcic 的修改版本进行扩展,如下所示:
然后我修改Foo
为:
但是,当我尝试编译Foo
关于Incompatible types: TCircle and TShape
. 如果我注释掉TCircle
循环,那么我会收到类似的错误TSquare
。如果我TSquare
也将循环注释掉,代码就会编译并工作。好吧,它的工作原理是枚举每个对象,因为它们都来自TShape
. 奇怪的是,编译器指示的行号是文件末尾之外的 2 行。在我的演示项目中,它表示第 177 行,但只有 175 行。
有什么办法可以使这项工作?我希望能够直接分配给 Circle 而无需经过任何类型转换或检查我的for
循环本身。
c# - 枚举数问题,有什么办法可以避免两个循环?
我有一个第三方 api,它有一个类,它为类中的不同项目返回一个枚举器。
我需要删除那个枚举器中的一个项目,所以我不能使用“for each”。我能想到的唯一选择是通过遍历枚举来获取计数,然后运行正常的 for 循环来删除项目。
有人知道避免这两个循环的方法吗?
谢谢
[更新]很抱歉造成混乱,但下面评论中的安德烈是对的。
这是我脑海中的一些伪代码,它不起作用,我正在寻找一个不涉及两个循环的解决方案,但我想这是不可能的:
MyProperty 是实现枚举器和删除方法的第三方类。
delphi - 在 TList 上实现过滤枚举器的更好方法
使用 Delphi 2010,假设我有一个这样声明的类:
对于这个列表,Delphi 为我们提供了一个枚举器,所以我们可以这样写:
麻烦的是,我想写这个:
也就是说,我希望能够使用一些标准为同一个列表提供多个枚举器。不幸的是,实现for X in Z
需要一个函数Z.GetEnumerator
,没有参数,返回给定的枚举数!为了避免这个问题,我定义了一个实现“GetEnumerator”函数的接口,然后我实现了一个实现该接口的类,最后我在 TMyList 上编写了一个返回接口的函数!而且我正在返回一个界面,因为我不想为手动释放非常简单的类而烦恼......无论如何,这需要大量的输入。这是它的样子:
使用它我终于可以写:
你知道更好的方法吗?也许 Delphi 确实支持直接使用参数调用 GetEnumerator 的方式?
后期编辑:
我决定使用 Robert Love 的想法,即使用匿名方法实现枚举器并使用 gabr 的“记录”工厂来保存另一个类。这允许我创建一个全新的枚举器,包含代码,只在函数中使用几行代码,不需要新的类声明。
这是我的通用枚举器在库单元中的声明方式:
这是一种使用它的方法。在任何类上,我都可以添加这样的函数(并且我有意创建一个不使用 aList<T>
来展示这个概念的强大功能的枚举器):
下面是我如何使用这个新的枚举器:
c - Ruby 枚举和 RETURN_ENUMERATOR - 关于 Ruby 的 C 内部结构的问题
我对 Ruby 如何处理枚举器的创建有点困惑。基于块的迭代很有意义并且对我有用;我仍然很困惑 Enumerator 的返回应该如何以代码方式运行。
这是我正在使用的代码:
在枚举器的情况下,如何调用 while 循环中的最后一行?
我的所有循环活动是否必须在调用 RETURN_ENUMERATOR 之前发生(因为 RETURN_ENUMERATOR 可能必须在 rb_yield() 之前)?
如果我想在内部迭代完成后发生一些事情怎么办?有了这个块,我可以简单地将它放在 while 循环之后;大概在枚举器的情况下同样有效 - 但如何?似乎每次通过循环它都会返回一个枚举器,那么枚举器是如何知道返回适当的对应对象的呢?rb_yield 将 rb_frame_hash 作为传递的 arg,但 RETURN_ENUMERATOR 似乎采用了在 Enumerator 在内部调用该方法时传递给该方法的 args。很明显,枚举器正在调用该方法本身——也许使用某种内部块来简单地返回 rb_frame_hash 的实例?
任何对内部结构的洞察力都值得赞赏。
-阿舍
ruby - Ruby 枚举器 - 为什么以异常结束?
在 Ruby 中迭代一个块非常简单——它干净利落地完成并继续执行其余代码。
另一方面,使用 Enumerator 进行迭代有点令人困惑。如果您在没有块的情况下调用 :each ,则会返回一个 Enumerator 。然后可以在 Enumerator 上调用 :next 以获取每个下一个迭代值。
然后奇怪的部分 - 当迭代完成时,而不是 Enumerator 返回 nil,它抛出一个异常:“迭代到达结束”。结果是它甚至没有返回值。
例如:
这样做的原因仅仅是因为枚举器可以返回 nil 值吗?答案只有在我发布此内容时才出现(所以我仍将发布它),但似乎必须如此。
如果是这样,这是处理此类问题的典型方式吗?使用异常来处理基本上按预期执行的代码似乎很奇怪。
c# - C# 字典中的下一个键
如何Enumerator
使用键获取 -Sorted- 字典中的项目?
注意:GetEnumerator()
获取Enumerator
第一个元素..
但是我需要使用给定键获取元素,以便使用例如...Enumerator
访问下一个元素MoveNext()
编辑:或者访问下一个元素的方法......
编辑:我更喜欢 const time 方法...
谢谢
c# - 从可枚举中获取下 N 个元素
上下文:C# 3.0,.Net 3.5
假设我有一个生成随机数的方法(永远):
我需要将这些数字分成 10 个一组,所以我想要类似的东西:
我已经定义了 Slice 方法,但我觉得应该已经定义了一个。这是我的 Slice 方法,仅供参考:
问题:有没有更简单的方法来完成我想要做的事情?也许是林克?
注意:上面的例子是一个简化,在我的程序中我有一个迭代器,它以非线性方式扫描给定的矩阵。
编辑:为什么Skip
+Take
不好。
实际上我想要的是:
无需重新生成 (10+20+30+40) 次的开销。我需要一个能够准确生成 40 个数字并将 4 组中的数字除以 10 的解决方案。
java - 有没有办法多次遍历 HttpServletRequest.getAttributeNames() ?
我正在尝试记录 HttpServletRequest 属性集合的内容。我需要在 servlet 首次启动时执行此操作,并且在 servlet 完成之前再次执行此操作。我这样做是为了理解一个粗鲁且维护不善的 servlet。因为我需要尽可能减少影响,所以 servlet 过滤器不是一个选项。
所以这就是问题所在。当 servlet 启动时,我将遍历 HttpServletRequest.getAttributeNames() 返回的枚举。但是,当我想再次遍历它时,getAttributeNames().hasMoreElements() 返回“false”!我找不到任何方法来“重置”枚举。更糟糕的是,即使我使用 HttpServletRequest.setAttribute() 将属性添加到集合中,当我调用 getAttributeNames().hasMoreElements() 时仍然会得到“假”的结果。
这真的可能吗?真的没有办法不止一次地遍历属性名称吗?
根据要求,这是我的代码。这很简单——不要以为我在做任何有趣的事情。