返品タイプがIGrouping<TKey, TElement>
またはIDictionary<TKey, TValue>
の場合、yield return
を使用できますか?イールドリターンはIEnumerable <T>に対してのみ機能しますか?
答えて
yield return
作品:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
それは内部ステート・マシンを構築するために持っているためです。これでは辞書などは使用できません。もちろん、代わりに適切なタイプのreturn
を使用することもできます。
ここで便利な記事http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx自分でIEnumerableを実装したい場合。 – Rory
@Roryはい、それを自分で実装するのは大規模なPITAです。イテレータブロックが存在するようになった今、私はこれまでどんな "通常の"理由も考えられません。私はそれをいくつか持っていますが、これは通常、C#1.2コンパイラでもビルドする必要のあるプロジェクトでの互換性のためです。正確には「通常の」シナリオではありません。 –
合意しましたが、場合によってはIGroupingがうまくいくかもしれませんが、代わりにIEnumerable
いいえ、ちょうどいいえ:-)
私の答えを参照してください; - –
私はそうは思わないです。 documentationは正確にはそれを綴っていませんが、語句の意味は、メソッドの戻り値の型がIEnumerable
またはIEnumerable<T>
の場合にのみ使用できることを意味します。 (yield return
を使用してあなたのメソッドから返される)IEnumerable
を実装するクラスを書くことができるかもしれませんが、それは本当に唯一のオプションです。
言語スペックは代わりにそれを綴ります... ECMA 334で8.18を参照してください –
いいえ。イテレータブロックは、単にコンパイラによって作成された状態マシンであるためです。この機能を使用すると、シーケンスの一部としてアイテムを「生成」し、アイテムを作成できます。
IEnumerable<T>
以外の場合(たとえばIDictionary
など)、コンパイラはそのインターフェイスを実装するメソッドを生成する必要があります。その時点では、コレクションではなくコレクションで作業するため、あまり意味がありません。シーケンス。
ただし、IEnumerable<KeyValuePair<K,V>>
は、辞書に似ています。その後、返品KeyValuePairsを返します。あなたは戻り値から辞書を作成する別の方法でこれをラップすることさえできます。最初のメソッドが保証しない唯一のことは、キーの一意性です。正確に4例について
その後、O(1)アクセス時間を失い、正しいキーを見つけるためにすべての単一KVPを巡回する必要があります。最悪のO(n)回。 –
回答:戻り型がIEnumerator
、IEnumerator<T>
、IEnumerable
、又はIEnumerable<T>
場合にのみ特許yield return
ステートメントを使用することができます。 C# 3.0 specの§8.14から
:
収率文が列挙子オブジェクト(§10.14.4)または列挙オブジェクト(TO値を生成するイテレータブロック(§8.2)で使用され§10.14.5 )を繰り返したり、反復の終了を知らせるために使用されます。 §10.14.4から
:
列挙子オブジェクトは、以下の特性を有する:
- それは
T
イテレータの降伏型でIEnumerator
とIEnumerator<T>
を実装します。
[...]§10.14.5から
:
列挙オブジェクトは、次の特性を有する:
- それは
T
イテレータの降伏型でIEnumerable
とIEnumerable<T>
を実装します。
[...]
はちょうどそれの後iteratorメソッドおよびチェーンToDictionary
またはGroupBy
を呼び出して、あなたはずっと同じことを持っています。それを複数の場所から呼び出す必要がある場合は、1行のラッパーメソッドに入れます。
yield return
は、IEnumerator<T>
のようなタイプで使用できますが、どうしてこのようなことをしないのですか?
internal static IEnumerable<Dictionary<byte, string>> GetData()
{
Dictionary<byte, string> result = GetMyData(); //read from db
yield return result;
}
希望します。
キーと値のペアではなく、辞書全体のリストを 'yield 'しています。 – titol
- 1. FlexMouseEvent.MOUSE_DOWN_OUTSIDEはポップアップコンポーネントに対してのみ機能しますか?
- 2. RedirectToActionはHttpGetに対してのみ機能しますか?
- 3. IEnumerableのToList()はどのように機能しますか?
- 4. Bean検証は、Springのコントローラメソッドに対してのみ機能しますか?
- 5. siginterrupt()は最初のシグナルに対してのみ機能しますか? (Python)
- 6. 条件付きコメントはスタイルシートに対してのみ機能しますか?
- 7. 検索機能はキーの特定の値に対してのみ機能しますか?
- 8. setShadowLayer()はボタンに対して機能しますか?
- 9. ROWLEXはネイティブにIEnumerable <>をサポートしていますか?
- 10. barplに対してmatplotlib pick_eventは機能しませんか?
- 11. Open Graphはタイムラインが有効になっているユーザーに対してのみ機能しますか?
- 12. Dijkstraは、負でないまたは正の重みに対して機能しますか?
- 13. TransactionScopeは異なるコンテキストオブジェクトに対して機能します
- 14. DoCheckのKeyValueDiffersはコンポーネントごとに1つのオブジェクトに対してのみ機能しますか?
- 15. 継承はどのように属性に対して機能しますか?
- 16. DFSは非ツリーに対してどのように機能しますか?
- 17. Jqgrid、dataEventはedittype:customに対しては機能しません
- 18. AVCaptureDevice.requestAccessForMediaTypeは、承認されていない認可ステータスに対してのみ機能しますか?
- 19. <*>の機能はどのように機能しますか?
- 20. IEnumerable <T>を正しく模擬していますか?
- 21. 2つのIEnumerable <T>を新しいIEnumerable <T>に連結する方法はありますか
- 22. なぜexecvpはシェルで最初に入力されたコマンドに対してのみ機能しますか?
- 23. jQuery.data()は、追加された要素に対してのみ機能しますか? jQueryのドキュメント(<a href="http://api.jquery.com/jQuery.data/" rel="nofollow">jQuery.data()</a>)で
- 24. なぜこのjQueryコードは1つの反復に対してのみ機能しますか?
- 25. ログインはデータベース内の最初のデータに対してのみ機能しますか?
- 26. CUDAの統合メモリは、ヒープ内の変数に対してのみ機能しますか?
- 27. first_or_createメソッドはRailsの関連付けに対して機能しますか?
- 28. 対象機能のカテゴリー機能はどのOOPS機能にありますか?
- 29. LINQ:別のIEnumerable <T>からIEnumerable <T>を作成していますか?
- 30. 相対インポートはどのように機能しますか?
可能性があります。[理解に役立つ] [利率](http://stackoverflow.com/questions/317462/some-help-understanding-yield) – nawfal