2010-03-18 11 views
13

Ich habe eine Klasse mit 2 Saiten und 1 Doppel (Menge).Wie sortiere ich ein Array von benutzerdefinierten Klassen?

Klasse Donator

  • string name
  • Zeichenfolge Kommentar
  • doppelte Menge

Jetzt habe ich ein Array von Donatoren gefüllt.
Wie kann ich nach Betrag sortieren?

+3

@Jeff Oh nein, er möchte definitiv 'IndividualHumanBeingWhoDonated' verwenden –

+6

Ein Spender ist ein Kenner von Donuts. – DRBlaise

+1

Duplikate: http://stackoverflow.com/questions/1301822/how-to-sort-an-array-of-object-by-a-specific-field-in-c http://stackoverflow.com/questions/ 1812044/how-to-sort-ein-Array-von-Objekten-in-Visual-C http: // Stackoverflow.com/questions/1211617/sort-a-array-of-strong-typed-objects-basierte-on-a-property-of-the-object-c –

Antwort

22

Wenn Sie IComparable<Donator> implementieren Sie können es wie folgt tun:

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

Sie dann sortieren anrufen können, was Sie wollen, sagen:

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

Die .Sort() ruft die CompareTo() Methode, die Sie für implementiert Sortierung.

Es gibt auch die Lambda-Alternative ohne IComparable<T>:

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

Eine Klasse implementieren IComparer ist wahrscheinlich ein besserer Ansatz. – eschneider

+2

@eschneider - Das ist fast immer Overkill für so etwas Einfaches. Wie wäre das "besser"? –

+0

Wahrscheinlichkeiten sind sie müssen verschiedene Arten sortieren. DonorAmountComparer, DonorLastNameComparer, DonorAmountThenLastNameComparer. – eschneider

4

Durch Implementierung IComparable und dann Array.Sort verwenden.

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

Er könnte auch einen Lambda-Ausdruck übergeben, wenn er nicht will Erstellen Sie eine neue Klasse –

+0

Versucht es, aber wie man wirklich sortiert? – Kovu

+1

Nein in .Net 2.0 kann er nicht. – AxelEckenberger

2

könnten Sie MyArray.OrderBy(n => n.Amount) Bereitstellung verwenden Sie den System.Linq Namespace enthalten sind.

+0

Ich habe versucht myArray = myArray.orderby ... Fehler ist: Fehler Eine implizite Konvertierung vom Typ "System.Linq.IOrderedEnumerable " in "DongleDonatorSite.Donator []" ist nicht möglich. – Kovu

+0

Verwenden Sie .ToArray(), um das Enumerable zurück in ein Array zu konvertieren. –

+0

Sie können am Ende '.ToArray()' hinzufügen oder den Typ der Variablen ändern, der Sie das Ergebnis zuweisen. Übrigens ist es in vielen Fällen praktischer (aber nicht immer, wenn Leistung ein Problem ist), Arrays nicht mehr zu verwenden und eine generische Liste zu verwenden. –

2

Ich benutze immer die Liste von Generika, zum Beispiel

List<Donator> MyList; 

dann nenne ich 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

Dies ist das gleiche wie a.Amount.CompareTo (b.Amount) – Ruben

+0

Richtig. Außerdem können Sie mit meiner Methode zusätzliche Logik hinzufügen, um nach Betrag zuerst zu sortieren, dann nach Name, wenn Betrag gleich ist usw. CompareTo ist in diesem Fall einfacher, und mein Beispiel wäre nur nützlich, wenn Sie eine interessantere Sortierung benötigen Logik. –

+0

Ich denke, du vermisst ein welliges. –

4

Sie können Verwenden Sie auch 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

Hier ist eine Art, ohne eine Schnittstelle implementieren zu müssen. Das ist eine allgemeine Liste

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

Ein anderer Weg ist mit einer Klasse zu erstellen, die IComparer implementiert, dann gibt es eine Überlastung in der Comparer-Klasse übergeben.

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

Auf diese Weise können verschiedene Klassen für jede spezifische Art benötigt haben könnte. Sie können einen nach Namen, Betrag oder anderen sortieren lassen.

Verwandte Themen