問題タブ [yield]
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# - イールドブレイク; -クレイジーな行動
「test1」は、フィールドとしてv1およびv2(params)を持つIEnumerableのようであり、「Test1」は呼び出されません。
「Test2」は「設計された」動作をします:)
どうしたの?
c# - イールドリターン対リターンセレクト
両方のアプローチの利点/欠点はどれですか?
対
編集MSILはほぼ同等なので、どちらが読みやすいと思いますか?
c# - キャッシングIEnumerable
最初は、コレクション全体を評価する必要がないため、上記のコードは優れています。
ただし、すべてのモジュールが 1 回列挙されると、変更がない場合に XDocument に対して繰り返しクエリを実行すると、コストが高くなります。
したがって、パフォーマンスの向上として:
これは、リスト全体を繰り返し使用する場合には優れていますが、それ以外の場合はそれほど優れていません。
リスト全体が繰り返されるまでリターンを生成し、それをキャッシュして後続のリクエストにキャッシュを提供できる中間点はありますか?
delphi - ジェネレータを使用せずに、Next()関数を使用してネストされたリストを反復処理する
私はPythonでこの問題を解決したいのですが、私はこの問題のためにDelphiで立ち往生しています。ネストされたリスト(実際にはネストされたリストをプロパティとして持つオブジェクトですが、気にしないでください)があり、ジェネレーター方式でそれらを反復処理したいと思います。つまり、ネストされたリストによって記述されたツリーの葉から次のアイテムを取得するNext関数を作成します。
たとえば、私が持っているとしましょう
Next()を8回連続して呼び出して、1..8を返すようにします。
イールドとジェネレーターのない言語でこれを行うにはどうすればよいですか?
ネストの深さは固定されていますが(この例では2、実際には4)、深さが可変であるより一般的なケースを解決する答えは歓迎されます。
編集:申し訳ありませんが、これはDelphi2007です。
c# - 列の値を IEnumerable として返す
私はこのコードが機能しています:
ただし、利回り returnに頼る必要のない、より良い (LINQish) 方法があるかどうか疑問に思っています。(そして、LINQ to SQLはオプションではありません:))
c# - ScalaにはC#のyieldと同等のものがありますか?
私はScalaを初めて使用します。私が理解していることから、ScalaのyieldはC#のyieldとは異なり、selectに似ています。
ScalaにはC#の歩留まりに似たものがありますか?C#の歩留まりは、イテレータの記述を非常に簡単にするため、優れています。
更新: Scalaで実装できるようにしたいC#の擬似コード例を次に示します。
このコードは、yieldを使用してグラフの反復幅優先走査を実装し、反復子を返すため、呼び出し元は通常のforループを使用してグラフを走査できます。
C#では、yieldはイテレータを簡単に記述できるようにするための単なる構文糖衣です(IEnumerable<T>
.NetではIterable
、Javaと同様)。イテレータとして、それは怠惰に評価されました。
更新II:ここでは間違っている可能性がありますが、C#でのyieldの全体的なポイントは、高階関数を作成する必要がないようにすることだと思います。たとえば、シーケンスをトラバースする関数を渡す代わりに、通常のforループを記述したり、///のようなメソッドを使用したりできますselect
。map
filter
where
たとえばgraph.iterator().foreach(n => println(n))
、の代わりにgraph.iterator( n => println(n))
。
このようにして、それらを簡単にチェーンできますgraph.iterator().map(x => x.foo).filter(y => y.bar >= 2).foreach(z => println(z))
。
c# - C#の「yield」と「yieldreturn」の違い(ある場合)は何ですか?
私は伝統的にC#でyieldをリターンなしで使用してきました。例:
しかし、他の例では、「yield return foo;」と書かれているのを見ました。http://msdn.microsoft.com/en-us/library/9k7k7cf0%28VS.80%29.aspxを参照してください。
違いはありますか?
python - ジェネレーターでファイルシステムをトラバースするにはどうすればよいですか?
サブディレクトリおよびサブサブディレクトリ内のファイルを含む、ディレクトリ内のすべてのファイルをトラバースするためのユーティリティ クラスを作成しようとしています。ジェネレーターはクールなので、ジェネレーターを使用しようとしました。しかし、私は思わぬ障害にぶつかりました。
ジェネレーターがディレクトリに到達すると、単純に新しいジェネレーターのメモリ位置が生成されます。ディレクトリの内容はわかりません。
新しいジェネレーターの代わりに、ジェネレーターがディレクトリの内容を生成するようにするにはどうすればよいですか?
ディレクトリ構造内のすべてのファイルを再帰的にリストする単純なライブラリ関数が既にある場合は、それについて教えてください。ライブラリ関数を複製するつもりはありません。
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に入れる必要があります。
iterator - C# 2.0 - 生成された反復子ブロックで「GroupBy」を実行する方法はありますか?
私は C# 2.0 アプリを使用しているため、linq/lambda の回答はここでは役に立ちません。
yield return
基本的に、オブジェクトが必要な状況に直面していますが、プロパティが一意である場合 (Group By)のみです。たとえば、ユーザーのコレクションがあり、名前に基づいてグループ化されたコレクションが必要だとします (20 人の Dave がいるかもしれませんが、コレクションには 1 つだけ表示したい)。
これが役立つ状況をたくさん思いつくことができますが、C# 2.0 では、別の内部リストで何を生成しているかを明示的に追跡しない限り、これは不可能だと思います。せずにそれを行うには、以前に生成されたセットにアクセスして、それらが存在するかどうかを確認する必要があります。
私はこれを考えすぎていますか、それとも理にかなっていますか? おそらく、IEnumerable<T>
インターフェイスを介してyieldにアクセスすることは理にかなっているので、次のようなことができるでしょう-