问题标签 [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.
c# - 为 IEnumerable/IEnumerator 寻找更快的实现
我正在尝试优化一个并发集合,以尽量减少读取的锁争用。第一遍是使用链表,它允许我只锁定写入,而许多同时读取可以继续畅通无阻。这使用了一个自定义IEnumerator
来产生下一个链接值。一旦我开始将集合上的迭代与普通进行比较,List<T>
我注意到我的实现速度大约是原来的一半(对于from x in c select x
1*m* 项目的集合,我的集合分别为24 毫秒List<T>
和49 毫秒)。
所以我想我会使用 aReaderWriteLockSlim
并在读取上牺牲一点争用,这样我就可以使用 aList<T>
作为我的内部存储。由于我必须在迭代开始时捕获读锁并在完成时释放它,所以我首先为 my IEnumerable
, foreach做了一个yield模式List<T>
。现在我只有66ms。
我查看了 List 实际做了什么,它使用了一个内部存储T[]
和一个自定义IEnumerator
来向前移动索引并返回当前索引值。现在,手动T[]
用作存储意味着更多的维护工作,但是,我正在追逐微秒。
然而,即使模仿IEnumerator
移动数组上的索引,我能做的最好的事情也是大约~38ms。那么是什么提供了List<T>
它的秘诀,或者说什么是迭代器的更快实现呢?
更新:原来我的主要速度罪魁祸首是运行调试编译,而List<T>
显然是发布编译。在发布时,我的实现仍然比 . 慢一点List<T>
,尽管在单声道上它现在更快。
我从朋友那里得到的另一个建议是 BCL 更快,因为它在 GAC 中,因此可以由系统预编译。将不得不在 GAC 中进行测试以测试该理论。
c# - 在foreach循环中访问枚举器?
我有一个 List 类,我想重写GetEnumerator()
以返回我自己的 Enumerator 类。此 Enumerator 类将具有两个附加属性,这些属性将在使用 Enumerator 时进行更新。
为简单起见(这不是确切的业务案例),假设这些属性是CurrentIndex
and RunningTotal
。
我可以在 foreach 循环中手动管理这些属性,但我宁愿封装此功能以供重用,而 Enumerator 似乎是正确的位置。
问题: foreach隐藏了所有 Enumerator 业务,那么有没有办法在 foreach 语句中访问当前的 Enumerator 以便我可以检索我的属性?还是我必须 foreach,使用令人讨厌的旧 while 循环,并自己操纵 Enumerator?
c# - 为什么 GetEnumerator() 存储在与 IEnumerator 不同的接口中?
我想知道为什么 GetEnumerator() 方法是从 IEnumerator 中提取出来并放在 IEnumerable 中的。在我看来,将所有枚举器方法保留在 IEnumerator 中会更有意义。
谢谢,
斯科特
c# - IEnumerable 和 IEnumerator 在同一个类中,坏主意?
这是一个坏主意吗?
此类仅作为 IEnumerable(Of T) 只读属性可见,它为我节省了一个包装 IEnumerator(Of T) 的附加类。但不知何故,这似乎是错误的。有没有更好的办法?
c# - 为什么在这个例子中(从 msdn 获得),在 GetEnumerator 方法中,new PeopleEnum 返回 IEnumerator?
为什么在这个来自 MSDN 的示例中,在GetEnumerator
方法中PeopleEnum
返回IEnumerator
?
更新: 顺便说一句,如果 Array 数据类型实现 ICloneable 接口,为什么 msdn 通过编写 for 循环将 pArray 复制到 _people ?
c# - 在迭代期间从 SortedList 中删除是否安全
我的问题是枚举器从 SortedList 中删除项目是否安全?
c# - 为什么.net中的数组只实现IEnumerable而不实现IEnumerable?
我正在实现自己的 ArrayList 类,当我意识到
没用。数组没有在 .NET 中实现 IEnumerator 的原因是什么?
有什么解决方法吗?
谢谢
.net - IEnumerable表示 IEnumerable 的“其余部分”序列
如果我正在走过一个IEnumerable<T>
,有没有办法IEnumerable<T>
在当前项目之后获得一个新的代表剩余项目。
例如,我想写一个扩展方法IEnumerator<T>.Remaining()
:
我正在考虑一种单链表的集合,所以应该有一种方法来表示任何剩余的元素,对吧?我看不出有任何方法可以在IEnumerable<T>
or上进行此操作IEnumerator<T>
,因此它可能与潜在的无限的、不确定的元素序列的概念不兼容。
c# - 实现通用 IEnumerator 和 IComparable 的问题
我正在研究 AVL 树。树本身似乎正在工作,但我需要一个迭代器来遍历树的值。因此,我尝试实现 IEnumerator 交互。不幸的是,我在实现 IEnumerator 和 IComparable 时遇到编译时错误。首先是代码,然后是错误。
VS2008 给出的错误:错误 1 类型“T”不能用作泛型类型或方法“Opdr2_AvlTreeTest_Final.AvlTreeNode”中的类型参数“T”。没有从“T”到“System.IComparable”的装箱转换或类型参数转换。
此错误在以下几行中给出:
现在我还没有包含树和节点逻辑。我有人认为有必要解决这个问题,就这么说吧!
谢谢!
c# - Can we use GetEnumerator() without using IEnumerable interface?
I have a class called Primes and this class implements GetEnumerator() without implementing IEnumerable interface.
I don't get it. Am I missing something?