問題タブ [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>
気付きました ( 1 from x in c select x
*m* アイテムのコレクションでは、コレクションで 24ミリ秒、コレクションで49 ミリ秒)。List<T>
そこで、aを使用ReaderWriteLockSlim
して、読み取り時の競合を少し犠牲にして、aList<T>
を内部ストレージとして使用できるようにしようと考えました。繰り返しの開始時に読み取りロックを取得し、完了時にそれを解放する必要があるため、最初に my の yield パターンを実行し、 internalIEnumerable
に対してforeachList<T>
を実行しました。今、私は66msしか得ていませんでした。
List が実際に何をするかを調べたところ、内部ストアと、インデックスを前方に移動して現在のインデックス値を返すT[]
カスタムが使用されています。IEnumerator
現在、ストレージとして手動で使用T[]
すると、メンテナンス作業が大幅に増えますが、マイクロ秒を追いかけています。
ただしIEnumerator
、配列のインデックスの移動を模倣しても、できることは約~38ms でした。では、List<T>
その秘密のソースを提供するものは何ですか? あるいは、イテレータのより高速な実装は何ですか?
更新:私の主な速度の犯人は、List<T>
明らかにリリース コンパイルである一方で、デバッグ コンパイルを実行していたことが判明しました。リリースでは、私の実装はまだ よりも少し遅いですがList<T>
、モノラルではより高速になりました。
友人から得たもう 1 つの提案は、BCL は GAC にあり、システムによってプリコンパイルできるため、高速であるというものです。その理論をテストするには、私のテストをGACに入れる必要があります。
c# - foreachループ内で列挙子にアクセスしますか?
Listクラスがあり、オーバーライドGetEnumerator()
して自分のEnumeratorクラスを返したいと思います。この列挙子クラスには、列挙子が使用されるときに更新される2つの追加のプロパティがあります。
CurrentIndex
簡単にするために(これは正確なビジネスケースではありません)、これらのプロパティがとだったとしましょうRunningTotal
。
foreachループ内でこれらのプロパティを手動で管理することもできますが、この機能をカプセル化して再利用したいので、列挙子が適切な場所のようです。
問題: foreachはすべての列挙子ビジネスを非表示にするので、foreachステートメント内で現在の列挙子にアクセスしてプロパティを取得する方法はありますか?それとも、foreachし、厄介な古いwhileループを使用して、列挙子を自分で操作する必要がありますか?
c# - GetEnumerator() が IEnumerator とは別のインターフェイスに格納されたのはなぜですか?
GetEnumerator() メソッドが IEnumerator から除外されて IEnumerable に配置された理由が気になりました。すべての列挙子メソッドを IEnumerator に保持する方が理にかなっているように思えます。
ありがとう、
スコット
c# - 同じクラスのIEnumerableとIEnumerator、悪い考えですか?
これは悪い考えですか?
このクラスは、IEnumerable(Of T)読み取り専用プロパティとしてのみ表示され、IEnumerator(Of T)をラップする追加のクラスを保存します。しかし、どういうわけかそれは間違っているようです。もっと良い方法はありますか?
c# - この例 (msdn から取得) の GetEnumerator メソッドで、新しい PeopleEnum が IEnumerator を返すのはなぜですか?
MSDN のこの例で、GetEnumerator
メソッド内でPeopleEnum
が返されるのはなぜIEnumerator
ですか?
更新: ところで、配列データ型が ICloneable インターフェイスを実装している場合、msdn が for ループを記述して pArray を _people にコピーしたのはなぜですか?
c# - 反復中にSortedListから削除しても安全ですか
私の質問は、列挙子がSortedListからアイテムを削除しても安全ですか?
c# - .net の配列が IEnumerable のみを実装し、IEnumerable を実装しないのはなぜですか?
私は独自の ArrayList クラスを実装していましたが、それに気づいたときは驚きました。
うまくいきませんでした。配列が .NET で IEnumerator を実装しない理由は何ですか?
回避策はありますか?
ありがとう
.net - IEnumerableIEnumerableの「残り」を表す順序
を歩いている場合、現在のアイテムの後に残っているアイテムを表すIEnumerable<T>
新しいアイテムを取得する方法はありますか。IEnumerable<T>
たとえば、拡張メソッドを記述したいと思いますIEnumerator<T>.Remaining()
。
ある種の単一リンクリストのコレクションを考えているので、残りの要素を表す方法があるはずですよね?IEnumerable<T>
どちらかでこれを公開する方法がわからないIEnumerator<T>
ので、おそらく、制限のない、非決定的な要素のシーケンスの概念と互換性がありません。
c# - ジェネリック IEnumerator および IComparable の実装に関する問題
私はAVLツリーに取り組んでいます。ツリー自体は機能しているようですが、ツリーの値を調べるにはイテレータが必要です。したがって、IEnumerator インターフェイスを実装しようとしました。残念ながら、IEnumerator と IComparable を実装するとコンパイル エラーが発生します。最初にコード、その下にエラー。
VS2008 によって表示されるエラー: エラー 1 型 'T' は、ジェネリック型またはメソッド 'Opdr2_AvlTreeTest_Final.AvlTreeNode' の型パラメーター 'T' として使用できません。'T' から 'System.IComparable' へのボックス変換や型パラメーターの変換はありません。
このエラーは、次の行に表示されます。
今のところ、ツリーとノードのロジックは含めていません。この問題を解決する必要があると思う人は、ただそう言ってください!
どうも!
c# - IEnumerableインターフェイスを使用せずにGetEnumerator()を使用できますか?
Primesというクラスがあり、このクラスはIEnumerableインターフェイスを実装せずにGetEnumerator()を実装しています。
理解できません。私は何かが足りないのですか?