2012-01-27 13 views
14

में नेस्टेड सूचियाँ मैं एक नेस्टेड सूची,OrderBy/ThenBy पाशन - सी #

List<List<String>> intable; 

मैं कहाँ चाहते हैं सभी स्तंभों को सॉर्ट करने के लिए है। समस्या यह है कि कॉलम की संख्या उपयोगकर्ता इनपुट पर निर्भर करती है।

सूची छंटाई की तरह इस ठीक काम करता है,

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(); 

लेकिन (इस उदाहरण के लिए 4 कॉलम कल्पना करते हुए) जब मैं एक पाश में डाल दिया, इस तरह:

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

यह अब काम करता है सही ढंग से, और केवल चौथा स्तंभ टाइप करता है।

+1

की तरह सूची बनाएं सॉर्ट देखें इस [http://social.msdn.microsoft .com/मंचों/en-US/linqprojectgeneral/धागा/61e502b4-6795-4e51-b70e-2be642cfc413 /] (http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/61e502b4-6795 -4e51-b70e-2be642cfc413 /) –

उत्तर

24

यह का एक संशोधित बंदरगाह तक पहुंच का मामला है। यह करने के लिए कोड को बदलें और यह काम करेगा:

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(); 

एरिक Lippert एक two-part article लिखा है समस्या का वर्णन। जैसा कि आप उम्मीद करते हैं, यह काम नहीं करता है - संक्षेप में - क्योंकि LINQ केवल i के अंतिम मान का उपयोग कर रहा है जब मूल्यांकन किया जाता है जब आप ToList() पर कॉल करते हैं। यह वही है जैसे कि आप लिखा था:

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

एरिक लिपर्ट ने पुष्टि की कि बंद व्यवहार सी # 5 में बदल जाएगा। [एसओ लिंक यहां] (http://stackoverflow.com/a/8899347/498969) –

+6

@AdamSpicer: यह केवल "foreach" loops के लिए "for" loops के लिए नहीं बदलेगा। –

+0

@EricLippert, स्पष्टीकरण के लिए धन्यवाद! –

0

एक comparer

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

तो यह

intable.Sort(new StringListComparer()); 
संबंधित मुद्दे