2013-12-09 12 views
9

私が使用する言語はC#です。Cのコレクションのすべての要素を反復する方法の間の高速な方法

たちはタイプTのオブジェクトのリストを持ってみましょう、

List<T> collection = new List<T>{.....}; 

たちは、コレクションの各項目の上に行きたいと言います。それはいろいろな方法で行うことができます。このうち、以下の2つです:

foreach(var item in collection) 
{ 
    // code goes here 
} 

foreach(T item in collection) 
{ 
    // code goes here 
} 

第二の方法は、最初か、そしてなぜよりも優れていますか?

ご回答いただきありがとうございます。

+14

「まったく同じ」 –

+7

実行時には「var」というものはありません。 2つは同じコンパイル済みコードを出力します。 – David

+0

'var'は型を書き出す必要がない単なる良い方法です。コンパイラはvarを実際の型に置き換えますので、最終結果にゼロの違いがあります。 – Tobberoth

答えて

24

これらはまったく同じです。便宜上、varは構文的砂糖です。 Listが通過する速度に違いはありません。

私がvarに従う大まかな規則は、オブジェクトのタイプが割り当ての右側にある場合にのみ使用することです。この場合、オブジェクトのタイプを明示的に指定することをお勧めします。 foreach他のエンジニアにとってはそれをより明確にすることができますが、それは個人的な選択になります。 Visual Studioでvarにカーソルを合わせると、そのタイプが表示されます(何があるべきかを推測できると仮定して)。 MSDNを引用

+2

Chrisは正しいですが、varを使うと速度に違いはありません。両方のループはコンパイル時に同じバイトコードに変換されます。 –

+3

時には 'var'は単なる「構文的砂糖」ではなく必須です。たとえば、匿名オブジェクトのリストを反復処理するときなどです。 – haim770

+0

@ haim770確かに、それは匿名の型のために必要です - ありがとう! –

8

アンは、暗黙的にローカル変数を入力したことを強くお タイプを自分で宣言した場合と同様に入力されたが、コンパイラはタイプを決定しています。

ので

var i = 10; // implicitly typed 
int i = 10; //explicitly typed 

はまったく同じです。

今、「より良い」ために、それはあなたの判断のためにあなたのパラメタに大きく依存します。速度の場合、forループはforeachよりも良く、T[]List<T>,according to Patrick Smacchiaより優れています。主なポイント:

  • forリスト上のループは、リスト上のforeachループよりも2倍安いよりも少しあります。
  • 配列のループは、リストのループより約2倍安いです。
  • したがって、forを使用して配列をループすることは、リストのループをforeach(私はこれが私たちがやっていることです)を使ってループするより5倍安いです。

引用元:In .NET, which loop runs faster, 'for' or 'foreach'?

参考:http://msdn.microsoft.com/en-us/library/bb383973.aspx

1

同じコレクションを反復処理するために何より高速な方法はありません。

あなたが自分のループや拡張メソッドを使用していても、これはすべて同じです。 varを使用すると、それは同じことがまだコンパイルされます。

唯一の違いは、辞書を使用すると、値の検索の点でList<T>またはCollectionより速いことです。辞書は検索の最適化で設計されました

3

ILコードを比較すると、実際に100%同じであることがわかります。 varは唯一のシンタックスシュガーです:

C#コード:

List<int> collection = new List<int>(); 
    collection.Add(1); 
    collection.Add(2); 
    collection.Add(3); 

    foreach (var myInt in collection) 
    { 
    Console.WriteLine(myInt); 
    } 

    foreach (var T in collection) 
    { 
    Console.WriteLine(T); 
    } 

bool flag; 

      System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>(); 
      list.Add(1); 
      list.Add(2); 
      list.Add(3); 
      System.Collections.Generic.List<int>.Enumerator enumerator = list.GetEnumerator(); 
      try 
      { 
       while (flag) 
       { 
        int i1 = enumerator.get_Current(); 
        System.Console.WriteLine(i1); 
        flag = enumerator.MoveNext(); 
       } 
      } 
      finally 
      { 
       enumerator.Dispose(); 
      } 
      enumerator = list.GetEnumerator(); 
      try 
      { 
       while (flag) 
       { 
        int i2 = enumerator.get_Current(); 
        System.Console.WriteLine(i2); 
        flag = enumerator.MoveNext(); 
       } 
      } 
      finally 
      { 
       enumerator.Dispose(); 
      } 
0

(VARとの)第一の方法は、読みやすさのために良いかもしれません。私はそれが最初の場所でVARを持つための主な理由だったと思い

foreach (System.Linq.IGrouping<string, User> user in users) 
{ 
} 

List<User> list = new List<User>(); 
var users = list.GroupBy(x => x.Name).OrderBy(x => x.Key); 
foreach (var user in users) 
{ 
//blah 
} 

: これを考えてみましょう。

+1

これは、「読みやすさの向上」*のかなり悪い例です。それが完全な名前空間型+グループを使用していることを考慮すると、ユーザー名は 'user'です。私はこれが 'var'キーワードを使う理想的な候補だと主張したいと思います。 – James

+0

@James Ups ..私は第1の方法を意味しました。 – Evgeni

+0

これについて@Jamesと同意する必要があります。 2つのブロックは等しくありません。美しさのような読みやすさも見る人の視点にあります。第1のブロックの最初の3行は、第2のブロックよりもはるかに理解を助ける。 – OnoSendai

関連する問題