2009-03-12 39 views
2

Aşağıdaki kodun en iyi yolunun bu olduğundan emin değilim. Başka bir foreach içinde foreach satmadım. Bu Linq ile daha iyi ** yapılabilir mi?Bu iki foreach döngüsünü yapmanın en etkili yolu nedir?

* Daha iyi Yukarıdaki

NOT tümü) daha şık/
c okumak için) ya
a) daha fazla ölçülebilir
b daha kolay olabilir anlıyoruz: .NET 3.5 çözümleri kabul :) NOT2: İki IList, Linq2Sql aracılığıyla bir çoklu kayıt saklı yordamının sonuçlarıydı.

burada yapmak kodu inanmak var:

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

Şerefe :)

Ben performans farklı olsun ama sanmıyorum

cevap

6

Eğer kısa ve özlü oluşu arıyorsanız:

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

Düzenleme: Jon'un bu versiyondaki ipucu daha hızlı olmasından sonra merak ettim ve her iki işlevi de yapabildim. Bu sürüm, şaşırtıcı olan iki katı kadar hızlı görünüyor. Demontajı kontrol ettim. Orijinal uygulamanın genel yükü, hem dış hem de iç döngü için yaratılan yeni sayımcılardan gelmek gibi görünmektedir ve bu da P zamanlarının yeni/elden çıkarılmasına neden olmaktadır.

Bu kod için "Birleştir" işlevinin sihirbazı olduğunu düşündüğüm yalnızca bir Enumerator oluşturuldu. Yine de nasıl çalıştığını incelemedim.

+1

Bu * nin * daha iyi performans göstereceğine inanıyorum, çünkü bu birleşim içinde bir hashtable kullanacaktır - karmaşıklık O (P * C) yerine O (P + C) olacaktır. –

+0

Bu çok korkak. +1 –

+0

Jon Gerçekten daha hızlı görünüyor. O (P + C) vs O (P * C) olayında haklısınız gibi görünüyor çünkü bu sürüm, orijinal iki dış/iç numaralayıcıyla çalışırken, birleştirme sonrasında tek bir numaralayıcı oluşturuyor. Bulgularıma cevabı ekledim. –

İlgili konular