1

アプローチ 1:

class myClass
{
   List<SomeType> _list;

   IENumerator<SomeType> GetEnumerator()
   {
      foreach(SomeType t in _list)
        yield return t;
   }
}

myClass m = new myClass();
List<SomeType> list;
...
foreach(SomeType t in m)
  list.Add(t);

アプローチ 2:

class myClass
{
    public List<SomeType> _list {get; private set;}
}

myClass m = new myClass();
...
List<SomeType> list = m.list;

どちらのアプローチが優れていますか? 2番目の場合は、yield returnの実際の使用法を教えていただけますか?

4

3 に答える 3

3

ない。

列挙子が必要で、基になるIEnumerable型 ( extends をList実装する) が既にある場合は、次のように返します。IListIEnumerable

public IEnumerator<SomeType> GetEnumerator ()
{
    return _list.GetEnumerator();
}

それ以外の場合、実際にリストが必要な場合、つまりインデックスを使用したランダム アクセスが必要な場合は、IList;を返します。実際にその内部実装型、つまり を返したい場合はList、それをアクセス可能なプロパティにするだけです。ただし、プライベート セッターはリストの変更 (項目の追加または削除など) を妨げないことに注意してください。それが必要な場合は、代わりに読み取り専用リストを返します。

public IList<SomeType> List
{
    get { return _list.AsReadOnly(); }
}

収量について

利回りリターンの実際の使用法を教えてください。

yield return実際にジェネレーターがある場合、次のアイテムを実際に生成する必要がある場合に便利です。簡単な例は、乱数を求め続ける限り、別の乱数を提供する乱数ジェネレーターです。必ずしも終わりがあるわけではありませんが、開始する前に数がわからない場合があります。

別の一般的な使用法は、外部ソースからデータを取得するものです。たとえば、Web サービスからのアイテムのリストです。アイテムの数がわからない前に、実際に必要なアイテムの数が必ずしもわからない場合があります (一度に 1 つずつ表示するエンドレス ディスプレイで表示したい場合があるため)。その場合、次のようにすることができます。

IEnumerable<Item> GetItems()
{
    while (Service.HasMorePages())
    {
        foreach (Item item in Service.GetNextPage())
        {
            yield return item;
        }
    }
    yield break;
}

GetNextPage一度にアイテムのリストを常に返し、Nすでに受け取ったアイテムよりも多くのアイテムが必要な場合はいつでも次のリストを取得します。

于 2012-11-22T14:25:42.580 に答える
3

collection-property を持つクラスは、通常、リストとして実行するのが最適です。これにより、複数回繰り返したり、変更したりできます。これは、単なるシーケンスを表す列挙子では不可能です。列挙子の一般的な用途は次のとおりです。

  • その場でデータをフィルタリングする (などEnumerable.Where)
  • 一度にすべてをロードせずに、複数のレコードを含むファイルから個々のアイテムを順番に読み取る
    • またはネットワークソケット
    • またはデータベースサーバー
  • 一連のデータに対して転送専用、読み取り専用のラッパーを提供する
于 2012-11-22T14:26:03.337 に答える
1

選択肢は際限なく、

public IEnumerator<int> FibonnaciSeries()
{
    int a = 1;
    int b = 1;

    yield return 1;
    yield return 1;

    while (true)
    {
        var c = a + b;
        a = b;
        b = c;
        yield return c;
    }
}

頭に浮かぶ些細な例の 1 つは、フィボナッチ数列は現実世界ですか?


これは可能な限り最も効率的な実装ではありません。

于 2012-11-22T14:35:24.543 に答える