10

またはループforeachに変換する必要があるループがあります。私のループは次のようになります。forwhile

foreach (Item item in Items)
{
    // some stuff
}

同等forまたはwhileループとは何ですか?

GetEnumeratorを取得するために使用する必要があると思いますIEnumerator<Item>が、適切に使用する方法がわかりません。Itemsはリストではありません。そうでない場合は、インデックスを使用します。

4

3 に答える 3

23

最も単純なケース(廃棄などなし)では、次を使用できます。

var enumerator = Items.GetEnumerator();// `var` to take advantage of more specific return type
while(enumerator.MoveNext())
{
  Item item = enumerator.Current;
  ...
}

正確なルールについては、C#仕様8.8.4foreachステートメントを確認してください。

フォームのforeachステートメント

foreach (V v in x) embedded-statement

次に、次のように展開されます。

{
  E e = ((C)(x)).GetEnumerator();
  try {
     V v;
     while (e.MoveNext()) {
        v = (V)(T)e.Current;
                embedded-statement
    }
  }
  finally {
     … // Dispose e
  }

}

(C#言語仕様バージョン4.0から引用)

ここで使用するタイプは、「コレクションタイプC、列挙型タイプE、および要素タイプT」です。EはのリターンタイプでありGetEnumerator、必ずしもダックタイピングを使用してIEnumerator<V>いるためではありません。foreach仕様には、いくつかのコーナーケースとこれらのタイプを推測する方法も記載されていますが、これらの詳細はおそらくここでは関係ありません。

C#5では、の宣言がループにv移動され、whileより直感的なクロージャーセマンティクスが取得されます。

于 2012-08-21T15:46:06.910 に答える
5

ループを使用する場合はfor、通常、n番目のアイテム(通常はインデクサー)にすばやくアクセスする方法があることを意味します。

for(int i = 0; i < Items.Count; i++)
{
  Item item = Items[i]; //or Items.Get(i) or whatever method is relevant.
  //...
}

イテレータにアクセスするだけの場合は、通常foreach、ループを使用するだけです。ただし、それができない場合、これは通常、意味のあるモデルです。

using(IEnumerator<Item> iterator = Items.GetEnumerator())
while(iterator.MoveNext())
{
  Item item = iterator.Current;
  //do stuff
}

技術的には、これをforループで行うこともできますが、構成がこの形式とうまく一致しないため、より困難になります。ループを使用できない理由について話し合う場合は、ループを使用するforeachかどうかに関係なく、最善の解決策を見つけるのに役立つ場合がありますfor

于 2012-08-21T15:48:07.107 に答える
2

これはforループと同等です

for (IEnumerator i = Items.GetEnumerator(); i.MoveNext(); )
{
    Item item = (Item)i.Current;
    // some stuff
}
于 2012-08-21T16:01:26.023 に答える