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.
}
}