2012-01-27 26 views
14

iç içe geçmiş Listeleri ben iç içe bir liste, ben istiyorum OrderBy/ThenBy döngü - C#

List<List<String>> intable; 

tüm sütunları sıralamak gerekir. Sorun, kolonların sayısının kullanıcı girdisine bağlı olmasıdır.

var tmp = intable.OrderBy(x => x[0]); 
for (int i = 1; i <= 3; i++) 
{ 
     tmp = tmp.ThenBy(x => x[i]); 
} 
intable = tmp.ToList(); 

artık çalışır: Bu bir döngü içine koyun zaman böyle,

var tmp = intable.OrderBy(x => x[0]); 
tmp = tmp.ThenBy(x => x[1]); 
tmp = tmp.ThenBy(x => x[2]); 
tmp = tmp.ThenBy(x => x[3]); 
intable = tmp.ToList(); 

Ama (bu örnek için 4 sütun varsayarak) çalışıyor gibi

listesini sıralama doğru ve sadece dördüncü sütunu sıralar.

+1

gibi liste bir karşılaştırıcısı sonra

class StringListComparer : IComparer<List<string>> { public int Compare(List<string> x, List<string> y) { int minLength = Math.Min(x.Count, y.Count); for (int i = 0; i < minLength; i++) { int comp = x[i].CompareTo(y[i]); if (comp != 0) { return comp; } } return x.Count.CompareTo(y.Count); } } 

oluştur bu [http://social.msdn.microsoft .com/forum/tr/linqprojectgeneral/iplik/61e502b4-6795-4e51-b70e-2be642cfc413 /] (http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/61e502b4-6795 -4e51-b70e-2be642cfc413 /) –

cevap

24

Bu, değiştirilmiş bir kapatmaya erişim için erişimidir. Buna kodunu değiştirin ve işe yarayacak:

var tmp = intable.OrderBy(x => x[0]); 
for (int i = 1; i <= 3; i++) { 
    var thisI = i; 
    tmp = tmp.ThenBy(x => x[thisI]); 
} 
intable = tmp.ToList(); 

Eric Lippert'ın sorunu açıklayan bir two-part article yazmıştır. Beklediğiniz gibi çalışmadığı nedeni - kısaca - çünkü LINQ, ToList()'u aradığınızda değerlendirildiğinde sadece son değeri i kullanıyor. Size yazmış gibi aynı:

var tmp = intable.OrderBy(x => x[0]); 
tmp = tmp.ThenBy(x => x[3]); 
tmp = tmp.ThenBy(x => x[3]); 
tmp = tmp.ThenBy(x => x[3]); 
intable = tmp.ToList(); 
+5

Eric Lippert kapanış davranışını doğruladı C# 5 olarak değişecektir. [SO Link Here] (http://stackoverflow.com/a/8899347/498969) –

+6

@AdamSpicer: "foreach" döngüleri için "for" döngülerinde değişmeyecektir. –

+0

@EricLippert, Açıklama için teşekkürler! –

0

Bkz sıralamak bu

intable.Sort(new StringListComparer());