2009-07-01 10 views

答えて

36

yield return作品:

  • IEnumerable
  • IEnumerable<T>
  • IEnumerator
  • IEnumerator<T>

それは内部ステート・マシンを構築するために持っているためです。これでは辞書などは使用できません。もちろん、代わりに適切なタイプのreturnを使用することもできます。

+0

ここで便利な記事http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx自分でIEnumerableを実装したい場合。 – Rory

+0

@Roryはい、それを自分で実装するのは大規模なPITAです。イテレータブロックが存在するようになった今、私はこれまでどんな "通常の"理由も考えられません。私はそれをいくつか持っていますが、これは通常、C#1.2コンパイラでもビルドする必要のあるプロジェクトでの互換性のためです。正確には「通常の」シナリオではありません。 –

+0

合意しましたが、場合によってはIGroupingがうまくいくかもしれませんが、代わりにIEnumerable >を使用するほうが簡単です。したがって、利回りの魔法を得ることができます。 – Rory

0

いいえ、ちょうどいいえ:-)

+0

私の答えを参照してください; - –

1

私はそうは思わないです。 documentationは正確にはそれを綴っていませんが、語句の意味は、メソッドの戻り値の型がIEnumerableまたはIEnumerable<T>の場合にのみ使用できることを意味します。 (yield returnを使用してあなたのメソッドから返される)IEnumerableを実装するクラスを書くことができるかもしれませんが、それは本当に唯一のオプションです。

+1

言語スペックは代わりにそれを綴ります... ECMA 334で8.18を参照してください –

2

いいえ。イテレータブロックは、単にコンパイラによって作成された状態マシンであるためです。この機能を使用すると、シーケンスの一部としてアイテムを「生成」し、アイテムを作成できます。

IEnumerable<T>以外の場合(たとえばIDictionaryなど)、コンパイラはそのインターフェイスを実装するメソッドを生成する必要があります。その時点では、コレクションではなくコレクションで作業するため、あまり意味がありません。シーケンス。

15

ただし、IEnumerable<KeyValuePair<K,V>>は、辞書に似ています。その後、返品KeyValuePairsを返します。あなたは戻り値から辞書を作成する別の方法でこれをラップすることさえできます。最初のメソッドが保証しない唯一のことは、キーの一意性です。正確に4例について

+7

その後、O(1)アクセス時間を失い、正しいキーを見つけるためにすべての単一KVPを巡回する必要があります。最悪のO(n)回。 –

4

回答:戻り型がIEnumeratorIEnumerator<T>IEnumerable、又はIEnumerable<T>場合にのみ特許yield returnステートメントを使用することができます。 C# 3.0 specの§8.14から

収率文が列挙子オブジェクト(§10.14.4)または列挙オブジェクト(TO値を生成するイテレータブロック(§8.2)で使用され§10.14.5 )を繰り返したり、反復の終了を知らせるために使用されます。 §10.14.4から

列挙子オブジェクトは、以下の特性を有する:

  1. それはTイテレータの降伏型でIEnumeratorIEnumerator<T>を実装します。

[...]§10.14.5から

列挙オブジェクトは、次の特性を有する:

  1. それはTイテレータの降伏型でIEnumerableIEnumerable<T>を実装します。

[...]

2

はちょうどそれの後iteratorメソッドおよびチェーンToDictionaryまたはGroupByを呼び出して、あなたはずっと同じことを持っています。それを複数の場所から呼び出す必要がある場合は、1行のラッパーメソッドに入れます。

-2

yield returnは、IEnumerator<T>のようなタイプで使用できますが、どうしてこのようなことをしないのですか?

internal static IEnumerable<Dictionary<byte, string>> GetData() 
    { 
     Dictionary<byte, string> result = GetMyData(); //read from db 
     yield return result; 
    } 

希望します。

+0

キーと値のペアではなく、辞書全体のリストを 'yield 'しています。 – titol

関連する問題