2010-05-06 14 views
65

मैं कई क्षेत्रों द्वारा सी # में ऑब्जेक्ट्स की एक सूची ऑर्डर करना चाहता हूं, केवल एक ही नहीं। उदाहरण के लिए, मैं एक वर्ग दो गुण, ए और बी के साथ बुलाया एक्स मान लीजिए, और मैं निम्नलिखित वस्तुओं है, इसी क्रम में:कई क्षेत्रों द्वारा एक सूची (सी #) आदेश?

object1 => एक = "एक", बी = "h"
object2 => एक = "एक", बी = "सी"
object3 => एक = "बी", बी = "x"
object4 => एक = "बी", बी = "बी"

और मैं एक विशेषता के आधार पर सूची ऑर्डर करने के लिए पहले चाहते हैं, और जब वे बराबर, बी तत्व द्वारा कर रहे हैं, इसलिए आदेश होगा:

"एक" "सी"
"एक" "h"
"बी" "बी"
"बी" "x"

जहाँ तक मुझे पता है, एक पैरामीटर द्वारा OrderBy विधि आदेश।

प्रश्न: मैं एक से अधिक फ़ील्ड द्वारा सी # सूची कैसे ऑर्डर कर सकता हूं?

आपको बहुत बहुत धन्यवाद

उत्तर

201

उपयोग ThenBy:

Customer.OrderBy(c => c.LastName).ThenBy(c => c.FirstName)

MSDN देखें: http://msdn.microsoft.com/en-us/library/bb549422.aspx

+1

यह उन्हें मेरे लिए आदेश नहीं दिया गया है? मुझे क्या याद आ रहा है? Docs.OrderBy (o => o.AcctNum) .henhen (o => o.DocDate); –

+0

आप पुराने .net का उपयोग कर रहे हैं। इस उत्तर को जांचें: http://stackoverflow.com/questions/289010/c-sharp-list-sort-by-x-then-y/289040#289040। –

+1

पोस्टरिटी के लिए: ऑर्डरबी मूल संग्रह को सॉर्ट नहीं करता है, यह एक IOrderedEnumerable देता है, इसलिए आपको ऑर्डरबी के परिणामों को एक चर में असाइन करना होगा। जैसे ग्राहक = ग्राहक। ऑर्डर बी (सी => सी .नाम)। फिर (सी। Forename) .सूची(); – CptCoathanger

6

public class MyObject : IComparable 
{ 
    public string a; 
    public string b; 

    virtual public int CompareTo(object obj) 
    { 
     if (obj is MyObject) 
     { 
      var compareObj = (MyObject)obj; 
      if (this.a.CompareTo(compareObj.a) == 0) 
      { 
       // compare second value 
       return this.b.CompareTo(compareObj.b); 
      } 
      return this.a.CompareTo(compareObj.b); 
     } 
     else 
     { 
      throw new ArgumentException("Object is not a MyObject "); 
     } 
    } 
} 

की तरह अपने वस्तु कुछ बनाओ भी ध्यान रखें कि CompareTo के लिए रिटर्न:

http://msdn.microsoft.com/en-us/library/system.icomparable.compareto.aspx

तब, यदि आप MyObject की एक सूची है, .Sort फोन() यानी

var objList = new List<MyObject>(); 
objList.Sort(); 
+0

प्रश्न: मैं एक से अधिक फ़ील्ड द्वारा सी # सूची कैसे ऑर्डर कर सकता हूं? हाँ! –

0

आपका वस्तु IComparable इंटरफ़ेस को लागू करना चाहिए।

इसके साथ आपकी कक्षा CompareTo(T other) नामक एक नया फ़ंक्शन बन जाती है। इस फ़ंक्शन के भीतर आप वर्तमान और अन्य ऑब्जेक्ट के बीच कोई तुलना कर सकते हैं और पहले पूर्ण होने के बारे में एक पूर्णांक मान वापस कर सकते हैं, दूसरे के बराबर या बराबर।

24

हां, आप तुलना विधि निर्दिष्ट करके इसे कर सकते हैं। लाभ यह है कि सॉर्ट किए गए ऑब्जेक्ट को IComparable

aListOfObjects.Sort((x, y) => 
    { 
     int result = x.A.CompareTo(y.A); 
     return result != 0 ? result : x.B.CompareTo(y.B); 
    }); 
संबंधित मुद्दे