2011-12-16 5 views
3

Ci-dessous, une liste l qui contient une liste de Product avec les propriétés Name et Price. La liste peut être triée par ordre alphabétique par la classe suivante ProductNameComparer qui implémente IComparar.Comment CompareTo trier une liste?

List<Product> l = p.GetList(); 
l.Sort(new ProductNameComparer()); 
MessageBox.Show(l[0].Name); 

public class ProductNameComparer : IComparer<Product> 
{ 
    public int Compare(Product x, Product y) 
    { 
     return x.Name.CompareTo(y.Name); 
    } 
} 

Je ne comprends pas comment la liste est triée. Selon MSDNCompareTo retourne un Int32 valeur de type de inférieur à zéro, zéro, ou supérieur à zéro. Si j'ai:

string c = "Apple"; 
string d = "Orange"; 
return c.CompareTo(d) 

La fonction retourne "-1".

Mais si je remplace l.Sort(-1) au lieu de l.Sort(new ProductNameComparer()) le code ne compile pas

Aussi pourquoi ne Compare(Product x, Product y) ne prend que deux produits comme argument et encore réussi à comparer et trier une liste (> 2) des produits?

+0

Vous avez deux questions. Connaissez-vous déjà les bases des algorithmes de tri comme QuickSort, MergeSort, Insertion Sort? – JasonTrue

Répondre

10

La méthode Sort n'appelle pas simplement Compare une seule fois - elle l'appelle plusieurs fois, chaque fois qu'elle doit comparer deux éléments. C'est un algorithme de tri général qui est capable de trier n'importe quelle collection d'éléments, tant qu'il peut en comparer deux d'une manière cohérente.

Le code ne compile pas si vous essayez d'appeler l.Sort(-1) parce que vous essayez simplement de transmettre un nombre entier - qu'est-ce que cela signifie?

Vous devez comprendre que vous ne donnez pas la Sort méthode un résultat de comparaison - vous lui donnez la possibilité de comparer tous les éléments dont il a besoin.

1

La surcharge de méthode de tri utilisée dans votre exemple (new ProductNameComparer()) nécessite que le paramètre implémente une interface IComparer. L'appel Sort(-1) ne fonctionnera pas car int n'implémente pas cette interface. Selon @JonSkeet, le résultat de l'appel CompareTo() est utilisé par la stratégie de tri pour ordonner la liste.

6

Aux fins de la démonstration ici est une mise en œuvre possible de la méthode de tri (un moment très inefficace, je sais):

public void Sort(System.Collections.Generic.IComparer<T> comparer) 
{ 
    for (int i = 0; i < this.Count - 1; i++) 
    { 
     for (int j = i + 1; j < this.Count; j++) 
     { 
      if (comparer.Compare(this[i], this[j]) > 0) 
      { 
       T tmp = this[i]; 
       this[i] = this[j]; 
       this[j] = tmp; 
      } 
     } 
    } 
}