2010-03-18 11 views
13

Tengo una clase con 2 cuerdas y 1 doble (cantidad).¿Cómo puedo ordenar una matriz de clases personalizadas?

Donador clase

  • nombre de cadena
  • comentario cadena
  • cantidad doble

Ahora tengo una matriz de donantes llena.
¿Cómo puedo ordenar por cantidad?

+3

@Jeff Oh, no, definitivamente quiere usar 'IndividualHumanBeingWhoDonated' –

+6

Un donante es un conocedor de donas. – DRBlaise

+1

Duplicados: 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-a-array-of-objects-in-visual-c http: // stackoverflow.com/questions/1211617/sort-a-array-of-highly-typed-objects-based-on-a-property-of-the-object-c –

Respuesta

22

Si implementa IComparable<Donator> Puede hacerlo de esta manera:

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

A continuación, puede llamar a una especie en lo que quieras, dicen:

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

El .Sort() llama al método CompareTo() ha implementado para clasificación.

También existe la alternativa de lambda sin IComparable<T>:

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

Una clase que implementa IComparer es probablemente un mejor enfoque. – eschneider

+2

@eschneider - Eso es casi siempre exagerado por algo tan simple. ¿Cómo sería eso "mejor"? –

+0

Lo más probable es que tengan que ordenar varias formas. DonorAmountComparer, DonorLastNameComparer, DonorAsambleThenLastNameComparer. – eschneider

4

Al implementar IComparable y luego usar 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

También podría pasar una expresión lambda si no quiere crear una nueva clase –

+0

Probé, pero ¿cómo ordenar realmente? – Kovu

+1

No en .Net 2.0 no puede. – AxelEckenberger

2

Usted podría utilizar MyArray.OrderBy(n => n.Amount) siempre que haya incluido el espacio de nombres System.Linq.

+0

Intenté myArray = myArray.orderby ... el error es: Fehler Eine implizite Konvertierung vom Typ "System.Linq.IrderedEnumerable " in "DongleDonatorSite.Donator []" ist nicht möglich. – Kovu

+0

Utilice .ToArray() para volver el enumerable a una matriz. –

+0

Es posible que desee agregar '.ToArray()' al final o cambiar el tipo de la variable a la que está asignando el resultado. Por cierto, en muchos casos es más práctico (pero no siempre cuando el rendimiento es un problema) dejar de usar matrices y comenzar a utilizar una lista genérica. –

2

siempre uso la lista genérica, por ejemplo

List<Donator> MyList; 

entonces yo llamo 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

Esto es lo mismo que a.Amount.CompareTo (b.Amount) – Ruben

+0

Derecha. Además, con mi método, puede agregar lógica adicional para ordenar primero por Cantidad, luego, Nombre si Cantidad es la misma, etc. CompareTo es más simple para este caso, y mi ejemplo solo sería útil si necesitara una clasificación más interesante lógica. –

+0

Creo que te falta un ondulado. –

4

Puede también use 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

Aquí hay una ordenación sin tener que implementar una interfaz. Se trata de utilizar una lista genérica

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

Otra forma es crear una clase que implementa IComparer, entonces hay una sobrecarga de pasar en la clase Comparer.

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

De esta forma podría tener diferentes clases para cada tipo específico necesario. Puede crear uno para clasificar por nombre, cantidad u otros.

Cuestiones relacionadas