2010-11-15 71 views
41

Je suis peuplant un tableau avec les instances d'une classe:Comment implémenter une interface IComparable?

BankAccount[] a; 
. . . 

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

Une fois que je remplir ce tableau, je voudrais trier par des montants d'équilibre. Pour ce faire, j'aimerais pouvoir vérifier si chaque élément est triable en utilisant IComparable.
Je dois le faire en utilisant des interfaces. Jusqu'à présent, j'ai le code suivant:

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

Mais je ne suis pas sûr si c'est la bonne solution. Aucun conseil?

Répondre

79

Vous ne devez pas définir vous-même IComparable. C'est déjà défini.

Vous devez plutôt implémenter IComparable sur votre classe BankAccount.

Si vous avez défini le class BankAccount, assurez-vous qu'il implémente l'interface IComparable

écrire ensuite BankAccout.CompareTo de comparer les montants de l'équilibre des deux objets.


Modifier

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

Edit 2 pour montrer une bonne réponse de Jeffrey L Whitledge:

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

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

im désolé u peut me donner un exemple de la façon dont je voudrais la mettre en œuvre –

+26

J'aime 'revenir this.Balance. CompareTo (that.Balance); ' –

+0

@jeff c'est juste de la mauvaise syntaxe –

4

Il y a déjà IComparable<T>, mais vous devriez idéalement supporter à la fois IComparable<T> et IComparable. L'utilisation du Comparer<T>.Default intégré est généralement une option plus facile. Array.Sort, par exemple, acceptera un tel comparateur.

14

IComparable existe déjà dans .NET avec cette définition de CompareTo

int CompareTo(Object obj) 

Vous n'êtes pas censé créer l'interface - vous êtes supposé l'implémenter.

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

im désolé pouvez-vous me donner un exemple de la façon dont je l'implémenterais –

9

Une alternative est d'utiliser LINQ et sauter la mise en œuvre IComparable au total:

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

Voulez-vous destructivement trier le tableau? Autrement dit, voulez-vous réellement changer l'ordre des éléments dans le tableau? Ou voulez-vous juste une liste des articles dans un ordre particulier, sans détruire la commande originale?

Je dirais qu'il est presque toujours préférable de faire ce dernier. Envisagez d'utiliser LINQ pour une commande non destructive. (Et pensez à utiliser un nom de variable plus significatif que "a".)

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

je veux le détruire en mettant en œuvre icompare –

+7

@Lippert: Bien que ce soit une réponse très valide, il semble de la discussion que l'OP comprend à peine ce que signifie implémenter une interface. Elle n'est probablement pas encore prête pour le niveau de questions que vous posez. – abelenky

+0

Salut Eric, quelle est la meilleure pratique pour traiter 'null' lors de l'implémentation de' IComparable 'et sous-classe' Comparer 'en supposant que' T' est un type de référence? Cela dépend-il du cas de l'utilisateur ou il est normalement préférable de lancer une exception puisque la vraie logique de comparaison est souvent transmise à une propriété sur 'T'. – stt106

1

Si vous ne devez trier ces BankAccounts, utilisez LINQ comme suit

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

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