問題タブ [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 インスタンスを取得する場合は問題になる可能性があります。Enumerator を明示的に使用する場合、またはファイナライズ中にロックを安全に解放する方法がある場合、消費者に Dispose を呼び出すことを思い出させる警告実装者でクラスを文書化する唯一のオプションはありますか? ファイナライザーは同じスレッド上でさえ実行されないため、私はそうは考えていませんが、これを改善する他の方法があるかどうか興味がありました.
編集
これについて少し考え、回答を読んだ後 (特にハンスに感謝)、これは間違いなく悪い考えだと判断しました。最大の問題は、実際には Dispose を忘れていることではなく、のんびりとした消費者が列挙中にデッドロックを作成していることです。コピーを取得し、コピーの列挙子を返すのに十分な時間だけ読み取りロックします。
delphi - Delphi:列挙子を使用してTListをフィルタリングするクラスタイプ別?
さて、これは混乱するかもしれません。私がやろうとしているのは、列挙子を使用して、クラスタイプに基づいたジェネリックリスト内の特定のアイテムのみを返すことです。
次の階層があるとします。
次のようなことができるように拡張するにはどうすればよいTShapeList
ですか。
次のように、ファクトリレコードを使用して、パラメータ化された列挙TShapeList
子でPrimozGabrijelcicのビットの適合バージョンを使用して拡張を試みました。
次に、次のように変更Foo
しました。
Foo
ただし、についてコンパイルしようとすると、Delphi2010がエラーをスローしますIncompatible types: TCircle and TShape
。ループをコメントアウトすると、TCircle
について同様のエラーが発生しTSquare
ます。ループについてもコメントするTSquare
と、コードがコンパイルされて機能します。それは、すべてのオブジェクトがから派生しているため、すべてのオブジェクトを列挙するという意味で機能しますTShape
。奇妙なことに、コンパイラが示す行番号は、ファイルの終わりを2行超えています。私のデモプロジェクトでは、177行目が示されていましたが、175行しかありません。
これを機能させる方法はありますか?for
タイプキャストを実行したり、ループ自体をチェックインしたりせずに、Circleに直接割り当てることができるようにしたいと思います。
c# - 列挙子の問題、2つのループを回避する方法はありますか?
クラス内のさまざまなアイテムの列挙子を返すクラスを持つサードパーティのAPIがあります。
その列挙子の項目を削除する必要があるため、「foreach」を使用できません。私が考えることができる唯一のオプションは、列挙型を反復処理してカウントを取得し、通常のforループを実行してアイテムを削除することです。
2つのループを回避する方法を知っている人はいますか?
ありがとう
[更新]混乱して申し訳ありませんが、コメントの以下のアンドレイは正しいです。
これは私の頭から出たいくつかの疑似コードで、機能せず、2つのループを含まないソリューションを探していますが、それは不可能だと思います。
MyPropertyは、列挙子とremoveメソッドを実装するサードパーティのクラスです。
delphi - TListにフィルターされた列挙子を実装するためのより良い方法
Delphi 2010を使用して、次のように宣言されたクラスがあるとします。
このリストについて、Delphiは親切にも列挙子を提供してくれるので、次のように書くことができます。
問題は、これを書きたいということです。
つまり、いくつかの基準を使用して、同じリストに複数の列挙子を提供する機能が必要です。残念ながら、の実装には、指定された列挙子を返す、パラメーターのないfor X in Z
関数の存在が必要です。Z.GetEnumerator
この問題を回避するために、「GetEnumerator」関数を実装するインターフェイスを定義し、次にそのインターフェイスを実装するクラスを実装し、最後にインターフェイスを返す関数をTMyListに記述します。そして、非常に単純なクラスを手動で解放することに煩わされたくないので、インターフェイスを返します...とにかく、これには多くの入力が必要です。これは次のようになります。
これを使用して、私は最終的に書くことができます:
これを行うためのより良い方法を知っていますか?たぶん、Delphiはパラメータを使ってGetEnumeratorを直接呼び出す方法をサポートしていますか?
後で編集:
私は、匿名メソッドを使用して列挙子を実装し、gabrの「レコード」ファクトリを使用してさらに他のクラスを保存するというRobertLoveのアイデアを使用することにしました。これにより、関数で数行のコードを使用するだけで、新しいクラス宣言を必要とせずに、コードを備えたまったく新しい列挙子を作成できます。
ライブラリユニットで、私の汎用列挙子がどのように宣言されるかを次に示します。
そして、これがそれを使用する方法です。List<T>
どのクラスでも、このような関数を追加できます(そして、この概念の力を示すためにを使用しない列挙子を意図的に作成しています):
そして、これが私がこの新しい列挙子をどのように使用するかです:
c - Ruby列挙とRETURN_ENUMERATOR-RubyのC内部に関する質問
Rubyが列挙子の作成をどのように処理するかについて少し混乱しています。ブロックベースの反復は理にかなっており、私にとってはうまく機能しています。列挙子の戻りがコード的にどのように機能するのか、私はまだ混乱しています。
これが私が使っているコードです:
列挙子の場合、whileループの最後の行はどのように呼び出されますか?
すべてのループアクティビティは、RETURN_ENUMERATORを呼び出す前に実行する必要がありますか(RETURN_ENUMERATORはおそらくrb_yield()の前に実行する必要があるため)?
内部反復が終了したら何かを起こさせたい場合はどうすればよいですか?ブロックを使用すると、whileループの後に簡単に配置できます。おそらく、列挙子の場合も同じように機能しますが、どのようにしたらよいでしょうか。ループを通過するたびに列挙子が返されるように見えますが、列挙子は適切な対応するオブジェクトを返すことをどのようにして知るのでしょうか。rb_yieldは、渡されたargとしてrb_frame_hashを取得しますが、RETURN_ENUMERATORは、列挙子がメソッドを内部的に呼び出すときに、メソッドに中継される引数を取得するようです。つまり、列挙子がメソッド自体を呼び出していることは明らかです。おそらく、rb_frame_hashのインスタンスを返すだけのある種の内部ブロックを使用しているのでしょうか。
内部への洞察は大歓迎です。
-アッシャー
ruby - Ruby列挙子-なぜ例外で終了するのですか?
Rubyでブロックを繰り返すのは簡単です。それはきれいに終了し、残りのコードに進みます。
一方、列挙子で繰り返すのは少し混乱します。ブロックなしで:eachを呼び出すと、代わりに列挙子が返されます。次に、列挙子で:nextを呼び出して、次の各反復値を取得できます。
そして奇妙な部分-反復が完了すると、列挙子がnilを返す代わりに、「反復は最後に到達しました」という例外をスローします。その結果、値も返されません。
例えば:
これは、列挙子がnil値を返すことができるようにするためだけの理由ですか?答えは私がこれを投稿するときにのみ私に起こります(それで私はまだそれを投稿するつもりです)が、そうであるに違いないようです。
もしそうなら、これはそのような問題を処理する典型的な方法ですか?例外を使用して、基本的に期待どおりに実行されるコードを処理するのは奇妙に思えます。
c# - C# 辞書の次のキー
Enumerator
キーを使用して -Sorted- 辞書のアイテムを取得する方法は?
注:GetEnumerator()
最初の要素を取得しEnumerator
ます..
しかし、たとえばEnumerator
次の要素にアクセスするには、特定のキーを持つ要素を取得する必要があります...MoveNext()
編集:または次の要素にアクセスする方法...
編集: const timeメソッドが好きです...
ありがとう
c# - 列挙可能な要素から次の N 要素を取得する
コンテキスト: C# 3.0、.Net 3.5
(永久に) 乱数を生成するメソッドがあるとします。
これらの数字を 10 ごとにグループ化する必要があるため、次のようにします。
Slice メソッドを定義しましたが、すでに定義されているはずです。参考までに、Slice メソッドを次に示します。
質問:私がやろうとしていることを達成するためのより簡単な方法はありますか? おそらくLinq?
注: 上記の例は簡略化したものです。私のプログラムでは、特定の行列を非線形にスキャンする Iterator を使用しています。
編集:Skip
+Take
がダメな 理由。
効果的に私が欲しいのは:
number (10+20+30+40) 回再生成するオーバーヘッドはありません。正確に 40 個の数字を生成し、4 つのグループの数字を 10 で割るソリューションが必要です。
java - HttpServletRequest.getAttributeNames() を複数回繰り返す方法はありますか?
HttpServletRequest 属性コレクションの内容をログに記録しようとしています。これは、サーブレットが最初に起動したときと、サーブレットが終了する直前に行う必要があります。私は、無愛想で手入れの行き届いていないサーブレットを理解しようとしてこれを行っています。できるだけ影響を少なくする必要があるため、サーブレット フィルターはオプションではありません。
ここで問題です。サーブレットが開始したら、HttpServletRequest.getAttributeNames() によって返される列挙を反復処理します。ただし、もう一度繰り返したい場合は、getAttributeNames().hasMoreElements() が「false」を返します。列挙を「リセット」する方法が見つかりません。さらに悪いことに、HttpServletRequest.setAttribute() を使用してコレクションに属性を追加しても、getAttributeNames().hasMoreElements() を呼び出すと「false」の結果が得られます。
これは本当に可能ですか?属性名を複数回繰り返す方法は本当にありませんか?
リクエストにより、ここに私のコードがあります。単純明快です。私が面白いことをしているとは思わないでください。