4

C# コードを見ると、次のようなパターンがよく見られます。

DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];

int i = 0;
foreach (DataType item in items)
{
    // Do some stuff with item, then finally
    itemProps[i] = item.Prop;
    i++;
}

for ループは のオブジェクトを反復処理しますが、反復処理用のカウンター ( )itemsも保持します。私は個人的に、この余分なものがぶらぶらしているのが好きではなく、代わりにおそらく次のようなことをするでしょう:iitemPropsi

DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];

for (int i = 0; i < items.Length; i++)
{
    // Do some stuff with items[i], then finally
    itemProps[i] = items[i].Prop;
}

私が気付いていない最初のアプローチには、おそらくいくつかの利点がありますか? これは、誰もが凝ったforeach (...)構文を使おうとした結果でしょうか? これについてのあなたの意見に興味があります。

4

7 に答える 7

7

C# 3.0 を使用している場合は、その方が適切です。

OtherDataType[] itemProps = items.Select(i=>i.Prop).ToArray();
于 2008-11-12T13:49:11.013 に答える
4

i が配列の外にある場合、ループの完了後に if が使用可能になります。アイテムの数をカウントしたいが、コレクションが .Count プロパティまたは .UBound プロパティを提供していない場合、これが役立つ可能性があります。

あなたのように、私は通常2番目の方法を使用しますが、私にはずっときれいに見えます。

于 2008-11-12T13:46:55.030 に答える
2

この場合、私はそうは思いません。ただし、コレクションが実装されていなくても、this[int index]GetEnumerator() が実装されている場合があります。後者の場合、選択肢はあまりありません。

于 2008-11-12T13:46:29.787 に答える
1

意味的には同等かもしれませんが、実際には、列挙子で foreach を使用すると、コンパイラが最適化する範囲が広がります。

頭のてっぺんからすべての引数を覚えているわけではありませんが、それらは「Effective C# 」で十分にカバーされており、読むことをお勧めします。

于 2008-11-12T14:05:25.147 に答える
1

一部のデータ構造は、ランダム アクセスにはあまり適していませんが、非常に高速に反復できます (ツリー、リンク リストなど)。したがって、これらのいずれかを反復する必要があるが、何らかの理由でカウントが必要な場合は、醜い道を進む運命にあります...

于 2008-11-12T13:51:30.683 に答える
1

foreach (項目内の DataType 項目) この foreach ループにより、項目のすべての DataType 項目を繰り返し処理していることが明確になります。コードが少し長くなるかもしれませんが、「悪い」コードではありません。もう 1 つの for ループについては、括弧内を確認して、このループが何に使用されているかを把握する必要があります。

この例の問題は、2 つの異なる配列を同時に反復処理しているという事実にありますが、これは頻繁には行いません..そのため、2 つの戦略の間で行き詰まっています.. -foreach と呼ぶか、古くてあまり愛されていない for(int i = 0; i ...) に戻ります。(もちろんその2以外にも方法はあります)

したがって、For vs Foreach ループを使用して質問に戻ってくるのは Vim vs Emacs だと思います :) for() が好きな人は、この foreach は役に立たず、パフォーマンスの問題を引き起こす可能性があり、単に大きいと言うでしょう。foreach を好む人は、「コードを読んで簡単にメンテナンスできるのであれば、2 行余分にあってもかまわない」などと言うでしょう。

最後に、最初の例では i が範囲外にあり、2 番目の例では範囲内にあります。その理由は?! foreach の外部で i を使用すると、別の方法で呼び出されるためです。そして、私の意見では、何が起こっているかをすぐに確認できるため、foreach の方法を好みます。<か=かを考える必要もありません。すべてのリストを繰り返し処理していることはすぐにわかりますが、悲しいことに、人々は最後に i++ を忘れるでしょう :D だから、私は Vim と言います!

于 2008-11-12T14:38:22.630 に答える
1

一部のコレクションは直接アクセス operator[] を実装していないこと、および foreach() で最も簡単にアクセスできる IEnumerable インターフェイスを使用して反復する必要があることを忘れないでください。

于 2008-11-12T15:17:50.413 に答える