2010-03-18 21 views
13

मेरे पास 2 तार और 1 डबल (राशि) वाला वर्ग है।मैं कस्टम कक्षाओं की सरणी कैसे क्रमबद्ध करूं?

वर्ग दानी

  • स्ट्रिंग नाम
  • स्ट्रिंग टिप्पणी
  • डबल राशि

अब मैं Donators की एक सरणी भरा है।
मैं राशि द्वारा कैसे क्रमबद्ध कर सकता हूं?

+3

@ जेफ ओह नहीं, वह निश्चित रूप से 'इंडियन ह्यूमनबिंगिंग जोडोनेटेड' –

+6

का उपयोग करना चाहता है एक दानदाता डोनट्स का एक गुणक है। – DRBlaise

+1

डुप्लिकेट्स: http://stackoverflow.com/questions/1301822/how-to-sort-an-array-of-object-by-a- विशिष्ट-field-in-c http://stackoverflow.com/questions/ 1812044/कैसे-टू-सॉर्ट-ए-एरे-ऑफ-ऑब्जेक्ट-इन-विज़ुअल-सी http: // stackoverflow।कॉम/प्रश्न/1211617/सॉर्ट-ए-एरे-ऑफ-फॉर-टाइप-ऑब्जेक्ट-आधारित-ऑन-ए-प्रॉपर्टी ऑफ द ऑब्जेक्ट-सी –

उत्तर

22

आप IComparable<Donator> लागू करते हैं तो आप इसे इस तरह कर सकते हैं:

public class Donator :IComparable<Donator> 
{ 
    public string name { get; set; } 
    public string comment { get; set; } 
    public double amount { get; set; } 

    public int CompareTo(Donator other) 
    { 
    return amount.CompareTo(other.amount); 
    } 
} 

फिर आप प्रकार पर जो कुछ भी आप चाहते हैं कॉल कर सकते हैं कहते हैं:

var donors = new List<Donator>(); 
//add donors 
donors.Sort(); 

.Sort() कॉल CompareTo() विधि आपके लिए लागू किया छँटाई।

var donors = new List<Donator>(); 
//add donors 
donors.Sort((a, b) => a.amount.CompareTo(b.amount)); 
+0

का उपयोग कर रहा है आईसीओएमपेयर लागू करने वाला एक वर्ग शायद एक बेहतर दृष्टिकोण है। – eschneider

+2

@eschneider - यह लगभग हमेशा कुछ आसान के लिए ओवरकिल है। यह "बेहतर" कैसे होगा? –

+0

संभावना है कि उन्हें विभिन्न तरीकों को हल करने की आवश्यकता होगी। डोनरमाउंट कॉम्पैडर, डोनरलास्टनाम कॉम्पैडर, डोनरमाउंट टाइनलास्टनाम कॉम्पैडर। – eschneider

4

IComparable लागू करके और फिर Array.Sort का उपयोग करें।

public class Donator : IComparable { 
    public string name; 
    public string comment; 
    public double amount; 

    public int CompareTo(object obj) { 
     // throws invalid cast exception if not of type Donator 
     Donator otherDonator = (Donator) obj; 

     return this.amount.CompareTo(otherDonator.amount); 
    } 
} 

Donator[] donators; // this is your array 
Array.Sort(donators); // after this donators is sorted 
+0

यदि वह नहीं चाहता है तो वह लैम्ब्डा अभिव्यक्ति भी पास कर सकता है एक नई कक्षा बनाएं –

+0

कोशिश की, लेकिन वास्तव में कैसे क्रमबद्ध करें? – Kovu

+1

नहीं .NET 2.0 में वह नहीं कर सकता। – AxelEckenberger

2

आप MyArray.OrderBy(n => n.Amount) का उपयोग उपलब्ध कराने आप System.Linq नाम स्थान शामिल किया जा सकता।

+0

मैंने myArray = myArray.orderby को आजमाया ... त्रुटि है: फेहलर ईइन इम्प्लाइज़ाइट कॉन्टेरिएरंग वॉम टाइप "सिस्टम। लिंक्ड.आईओर्डर्डअन्यूमेबल " में "DongleDonatorSite.Donator []" ist nicht möglich। – Kovu

+0

अंकुरित वापस एक सरणी में बदलने के लिए .ToArray() का उपयोग करें। –

+0

आप अंत में '.ToArray()' जोड़ना चाहते हैं या उस चर के प्रकार को बदल सकते हैं जिसके परिणामस्वरूप आप परिणाम दे रहे हैं। वैसे, कई मामलों में यह अधिक व्यावहारिक है (लेकिन जब प्रदर्शन एक मुद्दा है) तो सरणी का उपयोग बंद करने और सामान्य सूची का उपयोग शुरू करने के लिए। –

2

मैं हमेशा सूची सामान्य उपयोग करते हैं, मैं MyList.Sort

फोन
MyList.Sort(delegate (Donator a, Donator b) { 
    if (a.Amount < b.Amount) return -1; 
    else if (a.Amount > b.Amount) return 1; 
    else return 0;); 
+0

यह ए.माउंट.कंपारे के लिए समान है (बी। एमाउंट) – Ruben

+0

दाएं। इसके अतिरिक्त, मेरी विधि के साथ, आप पहले राशि द्वारा क्रमबद्ध करने के लिए अतिरिक्त तर्क जोड़ सकते हैं, फिर, यदि नाम समान है, तो नाम। इस मामले के लिए तुलना करें आसान है, और मेरा उदाहरण केवल उपयोगी होगा यदि आपको अधिक रोचक सॉर्टिंग की आवश्यकता है तर्क। –

+0

मुझे लगता है कि आप एक लहर खो रहे हैं। –

4

आप कर सकते हैं, उदाहरण के लिए

List<Donator> MyList; 

तो:

वहाँ भी IComparable<T> बिना लैम्ब्डा विकल्प है delegates का भी उपयोग करें:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Donor> myDonors = new List<Donor>(); 
     // add stuff to your myDonors list... 

     myDonors.Sort(delegate(Donor x, Donor y) { return x.amount.CompareTo(y.amount); }); 
    } 
} 

class Donor 
{ 
    public string name; 
    public string comment; 
    public double amount; 
} 
2

इंटरफ़ेस को लागू किए बिना यहां एक प्रकार है। यह एक सामान्य सूची

List<Donator> list = new List<Donator>(); 
    Donator don = new Donator("first", "works", 98.0); 
    list.Add(don); 
    don = new Donator("first", "works", 100.0); 
    list.Add(don); 
    don = new Donator("middle", "Yay", 101.1); 
    list.Add(don); 
    don = new Donator("last", "Last one", 99.9); 
    list.Add(don); 
    list.Sort(delegate(Donator d1, Donator d2){ return d1.amount.CompareTo(d2.amount); }); 
0

एक और तरीका है एक वर्ग है कि IComparer लागू करता है बनाने के लिए है उपयोग कर रहा है, तो comparer कक्षा में पारित करने के लिए एक अधिभार है।

http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx

इस तरह से आप की जरूरत प्रत्येक विशिष्ट प्रकार के लिए विभिन्न वर्गों हो सकता था। आप नाम, राशि या अन्य द्वारा क्रमबद्ध करने के लिए एक बना सकते हैं।

संबंधित मुद्दे