2010-11-15 10 views
41

Estoy poblar una matriz con instancias de una clase:¿Cómo implementar la interfaz de IComparable?

BankAccount[] a; 
. . . 

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

Una vez que pueblan esta matriz, me gustaría ordenarla a cantidades de saldo. Para hacer eso, me gustaría poder verificar si cada elemento es ordenable usando IComparable.
tengo que hacer esto utilizando las 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?

Respuesta

79

No debe definir IComparable mismo. Ya está definido.

Más bien, es necesario poner en práctica IComparable en su clase BankAccount.

Cuando haya definido la class BankAccount, asegúrese de que implementa la interfaz IComparable

Luego escribe BankAccout.CompareTo comparar las cantidades de equilibrio 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; 
    } 
} 

Editar 2 para mostrar buena respuesta de Jeffrey L Whitledge:

public class BankAccount : IComparable<BankAccount> 
{ 
    [...] 

    public int CompareTo(BankAccount that) 
    { 
     return this.Balance.CompareTo(that.Balance); 
    } 
} 
+0

lo siento me puedes dar un ejemplo de cómo me gustaría ponerlo en práctica –

+26

'Me gusta volver this.Balance. CompareTo (that.Balance); ' –

+0

@jeff, esa es la sintaxis mala –

4

Ya es IComparable<T>, pero lo ideal sería apoyar tanto IComparable<T> y IComparable. Usar el Comparer<T>.Default incorporado es generalmente una opción más fácil. Array.Sort, por ejemplo, aceptará tal comparador.

14

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

int CompareTo(Object obj) 

Se supone que no debe crear la interfaz, se supone que debe 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. 
    } 
} 
+0

lo siento, ¿pueden darme un ejemplo de cómo lo implementaría? –

9

Una alternativa es el uso de LINQ y omitir por completo la aplicación de IComparable:

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

¿Quieres destructivamente ordenar 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?

Yo sugeriría que es casi siempre mejor que hacer este ú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); 
+0

Quiero destruirlo implementando icompare –

+7

@Lippert: Si bien esta es una respuesta muy válida, parece de la discusión que el OP apenas entiende lo que significa implementar una interfaz. Probablemente aún no esté lista para el nivel de preguntas que estás haciendo. – abelenky

+0

Hola Eric, ¿cuál es la mejor práctica para tratar con 'null' al implementar' IComparable ' y la subclasificación 'Comparer ' suponiendo que 'T' es un tipo de referencia? ¿Depende del caso del usuario o normalmente es mejor emitir una excepción ya que la lógica de comparación real a menudo se reenvía a una propiedad en 'T'. – stt106

1

Si sólo necesita para ordenar estos BankAccounts, utilice LINQ como seguir

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

a = a.OrderBy(bank => bank.Balance).ToArray(); 
Cuestiones relacionadas