2010-12-04 13 views
6

Eğer bir IOrderedEnumberable<Car>'m varsa onu sıralıyorum ve sonra da bir projeksiyon sorgusu yapın ...LINQ'da IOrderedEnumerable <T> projeksiyonları siparişi koruyor mu?

projeksiyonda korunan düzendir?

Örneğin, bu senaryo çalışır mı?

IOrderedEnumberable<Car> allCarsOrderedFastestToSlowest = 
      GetAllCars() 
        .OrderByDescending(car=>car.TopSpeed); 

var top3FastestCarManufacturers = 
      allCarsOrderedFastestToSlowest 
        .Select(car=>car.Manufacturer) 
        .Distinct() 
        .Take(3); 

top3FastestCarManufacturers değişkeninin adı, gerçekten kodda neler olup bittiğinin anlamını taşır mı?

+0

(http [LINQ ile sipariş Koruma] olası yinelenen: //stackoverflow.com/questions/204505/preserving-order-with-linq) –

+0

Yinelenen öneriyle katılıyorum ve bu soruya cevap verilmiş olur. Neredeyse bunun özel bir alt sorusu. Silmek veya diğer soruya atıfta bulunmak için oy kullanıp kullanmadığınızdan emin değil misiniz? –

cevap

3

sipariş korunmuş olup olmadığını hakkında bir şey söylemez Distinct yöntemi için dokümantasyon. Bunun nedeni, muhtemelen kaynağın temel uygulamasına bağlıdır.

Her üreticiden hızlı arabaya alarak, istenen sonucu elde etmek için gruplandırma kullanabilir ve daha sonra bu üç hızlı olsun:

var topThreeFastestCarManufacturers = 
    GetAllCars() 
    .GroupBy(c => c.Manufacturer) 
    .Select(g => g.OrderByDescending(c => c.TopSpeed).First()) 
    .OrderByDescending(c => c.TopSpeed) 
    .Take(3); 
+0

İhtiyacınız olan tek şey, tablodan (nesne) bir sütun (özellik) olması, ancak birden fazlasına ihtiyaç duymanız halinde bozulacaksa bunu yapmanın iyi bir yoludur - hem araçların hem de maketin "ilk 3" üreticilerinden. Teknikle ilgili bir eleştiri değil, aynı zamanda, birden fazla ilgi alanınız olduğunda kopan tupleların bütünlüğünü korumak zorunda olmadığınız gerçeğine güveniyor. – tvanfosson

+0

@tvanfosson: Ne demek istiyorsun? Tek bir özellik değil, tüm özelliklerle birlikte üç araba nesnesi döndürür. İronik olarak, kendi cevabınız * bu sınırlamaya sahip ... – Guffa

+0

Üzgünüm, yeterince okumamış olmalıyım. 'Üreticiyi seç, maks (üstte)' ye çeviren bir sorgu yaptığınızı sanıyordum. Bunun için SQL'in nasıl bir şey olduğunu merak ediyorum. – tvanfosson

3

Sizi rahatsız edecek şeylerden şüpheleniyorum, Distinct. Bu, üreticinin farklı sonuçları üretmesi için sonuçları yeniden sıralayacaktır. Üç farklı üreticiye sahip olana kadar listeyi tekrarlamak istiyorum.

Seçim, siparişi koruyacak, ancak Distinct'teki açıklamalar, sırasız bir sonuç kümesini döndürdüğünü ve uygulamaya bağımlı olduğunu belirtiyor. Emin olmak için, siparişi saklı tutmaya ve sadece yinelemeyi kullanarak yapmayacağım.

var top3 = new List<string>(); 
foreach (var manufacturer in allCarsOrderedFastestToSlowest 
           .Select(car=>car.Manufacturer)) 
{ 
    if (!top3.Contains(manufacturer)) 
    { 
     top3.Add(manufacturer); 
     if (top3.Count == 3) 
     { 
      break; 
     } 
    } 
} 
İlgili konular