2

これが次のコードを実行する最良の方法であるかどうかはわかりません。私は、別の foreach 内の foreach で販売されていません。これは、Linq を使用して *より良い** ことができますか?


*私は、a)パフォーマンスが向上する
b) 読みやすい/エレガント
になる c) 上記のすべての いずれかが改善される可能性があることを理解しています

注: 受け入れられた .NET 3.5 ソリューション :) 注 2: 2 つの IList は、Linq2Sql を介したマルチ レコードセット ストアド プロシージャの結果でした。

これが信じられないコードです:

// 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;    
    }
}

乾杯 :)

4

1 に答える 1

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; 
}

編集:このバージョンがより高速であるというジョンのヒントの後、私は興味を持ち、両方の機能をプロファイリングしました。このバージョンは 2 倍高速に見えますが、これは驚くべきことです。分解チェックしました。元の実装のオーバーヘッドは、新しい列挙子が外側ループと内側ループの両方に対して作成されることに起因するようで、P 回の new/dispose オーバーヘッドが発生します。

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

于 2009-03-12T05:30:13.590 に答える