2010-06-19 5 views
0

Comment peut-on trouver ci-dessous l'arborescence en fonction de la valeur int. Mais si vous avez compilé ci-dessous codes d'erreur: Exception d'opération invalide ... Détail: Échec de la comparaison de deux éléments dans le tableau.Comment puis-je trier Arraylist avec une classe?

namespace SortArray 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ArrayList otomobil = new ArrayList(); 
      otomobil.Add(new Otomobil() { Model = 2000, Marka = "mercedes", Renk = "Kırmızı" }); 
      otomobil.Add(new Otomobil() { Model = 2002, Marka = "Opel", Renk = "Yeşil" }); 
      otomobil.Add(new Otomobil() { Model = 2009, Marka = "Audi", Renk = "Mavi" }); 

      otomobil.Sort(); 
      for (int i = 0; i < otomobil.Count; i++) 
      { 
       Console.WriteLine(otomobil[i].ToString()); 
      } 

     } 
    } 

    public class Otomobil 
    { 
     public string Marka { get; set; } 
     public int Model { get; set; } 
     public string Renk { get; set; } 

     public Otomobil() 
     { 

     } 

     public override string ToString() 
     { 
      return Marka + "(" + Model.ToString() + "-" + Renk + ")"; 
     } 

     public int CompareTo(object obj) 
     { 
      if (obj == null) 
       return 1; 


      Otomobil outer = obj as Otomobil; 
      if (outer == null) 
       throw new ArgumentException(); 

      if (this.Model > outer.Model) 
       return 1; 
      else if (this.Model < outer.Model) 
       return -1; 
      else return 0; 
     } 
    } 
}
+1

34% est trop mauvais .. :( –

+1

Et encore une autre observation de l'ArrayList laid. – Marc

Répondre

5

classe Otomobil: IComparable

2

Voici un comparateur générique que j'utilise assez régulièrement:

public class GenericComparer<T> : IComparer<T> 
{ 
    public string SortExpression { get; set; } 
    public int SortDirection { get; set; } // 0:Ascending, 1:Descending 

    public GenericComparer(string sortExpression, int sortDirection) 
    { 
     this.SortExpression = sortExpression; 
     this.SortDirection = sortDirection; 
    } 
    public GenericComparer() { } 

    #region IComparer<T> Members 
    public int Compare(T x, T y) 
    { 
     PropertyInfo propertyInfo = typeof(T).GetProperty(SortExpression); 
     IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null); 
     IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null); 

     if (SortDirection == 0) 
     { 
      return obj1.CompareTo(obj2); 
      } 
     else return obj2.CompareTo(obj1); 
    } 
    #endregion 
} 

Pour utiliser ceci:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Otomobil> otomobil = new List<Otomobil>(); 
     otomobil.Add(new Otomobil() { Model = 2000, Marka = "mercedes", Renk = "Kırmızı" }); 
     otomobil.Add(new Otomobil() { Model = 2002, Marka = "Opel", Renk = "Yeşil" }); 
     otomobil.Add(new Otomobil() { Model = 2009, Marka = "Audi", Renk = "Mavi" }); 

     otomobil.Sort(new GenericComparer<Otomobil>("Model", 0 /* ASC */)); 
     foreach(var item in otomobil) 
     { 
      Console.WriteLine(item.ToString()); 
     } 

    } 
} 

J'aime cette classe, et l'utiliser régulièrement dans ASP.NET, car je peux alors utiliser (int)SortDirection.Ascending au lieu de 0 comme deuxième paramètre, ce qui le rend un peu plus facile à lire.

Vous pouvez facilement modifier cette classe GenericComparer pour accepter un paramètre Func<> au lieu d'une chaîne pour le rendre plus convivial. Bien sûr, cela ne fonctionnera que sur les propriétés qui implémentent IComparable.

Questions connexes