2009-03-12 8 views
2

これが次のコードを実行する最善の方法であるかどうかはわかりません。私は別のforeachの中でforeachで売られていません。これはLinqの方がいいでしょうか?**これら2つのforeach-loopを実行する最も効率的な方法は何ですか?

*私は/よりエレガントな
Cを読みやすい)より良いが、どちらか
a)はよりパフォーマンス
Bすることができることを理解して)上記

NOTEのすべて:受け入れ.NET 3.5ソリューション:) NOTE2:2つのIListは、Linq2Sqlを介した複数レコードセットストアドプロシージャの結果でした。

ここでmakeがありますが、コードを信じて:

// These two lists are the results from a IMultipleResults Linq2Sql stored procedure. 
IList<Car> carList = results.GetResult<Car>().ToList(); 
IList<Person> people = results.GetResult<Person>().ToList(); 

// Associate which people own which cars. 
foreach(var person in people) 
{ 
    var cars = (from c in cars 
       where c.CarId == person.CarId 
       select c).ToList(); 

    foreach (var car in cars) 
    { 
     car.Person = person;  
    } 
} 

乾杯:)

答えて

6

あなたは簡潔さを探しているなら、私はパフォーマンスは何が違うのだろうと思うが、しないでください:

var q = from person in people 
     join car in cars on person.CarId equals car.CarId 
     select new { car, person }; 
foreach(var o in q) 
{ 
    o.car.Person = o.person; 
} 

編集:このバージョンでのJonのヒントがより速くなった後、私は興味があり、両方の機能をプロファイリングしました。このバージョンは2倍速くてすごく素晴らしいです。私は分解を確認した。元の実装のオーバーヘッドは、新しい列挙子が外部ループと内部ループの両方で作成されることから来ていると思われ、P回の新規/ディスポーザオーバーヘッドが発生します。

このコードでは、「結合」機能の魔法と思われる列挙子が1つだけ作成されています。私はそれがどのように動作するか調べなかった。

+1

私はこれがもっとうまくいくと信じています。結合の中でハッシュテーブルを使っています。複雑さはO(P * C)の代わりにO(P * C)になります。 –

+0

これはとてもファンキーです。 +1 –

+0

Jonそれは本当に速いようです。 O(P + C)とO(P * C)の違いはありません。このバージョンでは結合が実行された後に単一の列挙子が作成され、2つの外部/内部列挙子で元の動作が行われるからです。私は答えに自分の発見を加えました。 –

関連する問題