sort objeto net menos implementar example ejemplo debe c# interface icomparable

c# - objeto - ¿Cómo implementar la interfaz IComparable?



icomparer c# example (6)

Estoy poblando una matriz con instancias de una clase:

BankAccount[] a; . . . a = new BankAccount[] { new BankAccount("George Smith", 500m), new BankAccount("Sid Zimmerman", 300m) };

Una vez que complete esta matriz, me gustaría ordenarla por cantidades de saldo. Para hacer eso, me gustaría poder verificar si cada elemento se puede ordenar usando IComparable .
Necesito hacer esto usando interfaces. Hasta ahora tengo el siguiente código:

public interface IComparable { decimal CompareTo(BankAccount obj); }

Pero no estoy seguro de si esta es la solución correcta. ¿Algún consejo?


¿Quieres ordenar de forma destructiva la matriz? Es decir, ¿desea realmente cambiar el orden de los elementos en la matriz? ¿O solo quieres una lista de los artículos en un orden en particular, sin destruir el orden original?

Sugeriría que casi siempre es mejor hacer esto último. Considere usar LINQ para un orden no destructivo. (Y considere usar un nombre de variable más significativo que "a").

BankAccount[] bankAccounts = { whatever }; var sortedByBalance = from bankAccount in bankAccounts orderby bankAccount.Balance select bankAccount; Display(sortedByBalance);


Si solo necesita ordenar estas BankAccounts , use LINQ como sigue

BankAccount[] a = new BankAccount[] { new BankAccount("George Smith", 500m), new BankAccount("Sid Zimmerman", 300m) }; a = a.OrderBy(bank => bank.Balance).ToArray();


Una alternativa es usar LINQ y omitir la implementación de IComparable por completo:

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray();


Usted no debe definir IComparable usted mismo. Ya está definido.

Por el contrario, debe implementar IComparable en su clase BankAccount .

Donde definió la class BankAccount , asegúrese de que implementa la interfaz IComparable

Luego escriba BankAccout.CompareTo para comparar las cantidades de saldo de los dos objetos.

Editar

public class BankAccount : IComparable<BankAccount> { [...] public int CompareTo(BankAccount that) { if (this.Balance > that.Balance) return -1; if (this.Balance == that.Balance) return 0; return 1; } }

Edite 2 para mostrar la buena respuesta de Jeffrey L Whitledge:

public class BankAccount : IComparable<BankAccount> { [...] public int CompareTo(BankAccount that) { return this.Balance.CompareTo(that.Balance); } }


Ya existe IComparable<T> , pero idealmente debería ser compatible tanto con IComparable<T> como con IComparable . Usar el Comparer<T>.Default es generalmente una opción más fácil. Array.Sort , por ejemplo, aceptará dicho comparador.


IComparable ya existe en .NET con esta definición de CompareTo

int CompareTo(Object obj)

Se supone que no debes crear la interfaz, se supone que debes implementarla.

public class BankAccount : IComparable { int CompareTo(Object obj) { // return Less than zero if this object // is less than the object specified by the CompareTo method. // return Zero if this object is equal to the object // specified by the CompareTo method. // return Greater than zero if this object is greater than // the object specified by the CompareTo method. } }