问题标签 [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 投票
1 回答
1033 浏览

c# - 为 IEnumerable/IEnumerator 寻找更快的实现

我正在尝试优化一个并发集合,以尽量减少读取的锁争用。第一遍是使用链表,它允许我只锁定写入,而许多同时读取可以继续畅通无阻。这使用了一个自定义IEnumerator产生下一个链接值。一旦我开始将集合上的迭代与普通进行比较,List<T>我注意到我的实现速度大约是原来的一半(对于from x in c select x1*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 中进行测试以测试该理论。

0 投票
3 回答
9503 浏览

c# - 在foreach循环中访问枚举器?

我有一个 List 类,我想重写GetEnumerator()以返回我自己的 Enumerator 类。此 Enumerator 类将具有两个附加属性,这些属性将在使用 Enumerator 时进行更新。

为简单起见(这不是确切的业务案例),假设这些属性是CurrentIndexand RunningTotal

我可以在 foreach 循环中手动管理这些属性,但我宁愿封装此功能以供重用,而 Enumerator 似乎是正确的位置。

问题: foreach隐藏了所有 Enumerator 业务,那么有没有办法在 foreach 语句中访问当前的 Enumerator 以便我可以检索我的属性?还是我必须 foreach,使用令人讨厌的旧 while 循环,并自己操纵 Enumerator?

0 投票
6 回答
764 浏览

c# - 为什么 GetEnumerator() 存储在与 IEnumerator 不同的接口中?

我想知道为什么 GetEnumerator() 方法是从 IEnumerator 中提取出来并放在 IEnumerable 中的。在我看来,将所有枚举器方法保留在 IEnumerator 中会更有意义。

谢谢,

斯科特

0 投票
3 回答
865 浏览

c# - IEnumerable 和 IEnumerator 在同一个类中,坏主意?

这是一个坏主意吗?

此类仅作为 IEnumerable(Of T) 只读属性可见,它为我节省了一个包装 IEnumerator(Of T) 的附加类。但不知何故,这似乎是错误的。有没有更好的办法?

0 投票
2 回答
792 浏览

c# - 为什么在这个例子中(从 msdn 获得),在 GetEnumerator 方法中,new PeopleEnum 返回 IEnumerator?

为什么在这个来自 MSDN 的示例中,在GetEnumerator方法中PeopleEnum返回IEnumerator

更新: 顺便说一句,如果 Array 数据类型实现 ICloneable 接口,为什么 msdn 通过编写 for 循环将 pArray 复制到 _people ?

0 投票
6 回答
4013 浏览

c# - 在迭代期间从 SortedList 中删除是否安全

我的问题是枚举器从 SortedList 中删除项目是否安全?

0 投票
2 回答
35937 浏览

c# - 为什么.net中的数组只实现IEnumerable而不实现IEnumerable?

我正在实现自己的 ArrayList 类,当我意识到

没用。数组没有在 .NET 中实现 IEnumerator 的原因是什么?

有什么解决方法吗?

谢谢

0 投票
4 回答
690 浏览

.net - IEnumerable表示 IEnumerable 的“其余部分”序列

如果我正在走过一个IEnumerable<T>,有没有办法IEnumerable<T>在当前项目之后获得一个新的代表剩余项目。

例如,我想写一个扩展方法IEnumerator<T>.Remaining()

我正在考虑一种单链表的集合,所以应该有一种方法来表示任何剩余的元素,对吧?我看不出有任何方法可以在IEnumerable<T>or上进行此操作IEnumerator<T>,因此它可能与潜在的无限的、不确定的元素序列的概念不兼容。

0 投票
4 回答
1661 浏览

c# - 实现通用 IEnumerator 和 IComparable 的问题

我正在研究 AVL 树。树本身似乎正在工作,但我需要一个迭代器来遍历树的值。因此,我尝试实现 IEnumerator 交互。不幸的是,我在实现 IEnumerator 和 IComparable 时遇到编译时错误。首先是代码,然后是错误。

VS2008 给出的错误:错误 1 ​​类型“T”不能用作泛型类型或方法“Opdr2_AvlTreeTest_Final.AvlTreeNode”中的类型参数“T”。没有从“T”到“System.IComparable”的装箱转换或类型参数转换。

此错误在以下几行中给出:

现在我还没有包含树和节点逻辑。我有人认为有必要解决这个问题,就这么说吧!

谢谢!

0 投票
4 回答
1314 浏览

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?