Как я могу отсортировать Arraylist с классом? - PullRequest
0 голосов
/ 19 июня 2010

Как я могу найти ниже arraylist согласно значению int. Но если вы скомпилировали ниже коды ошибок: недопустимая исключительная операция ... Подробно: Не удалось сравнить два элемента в массиве.

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

Ответы [ 2 ]

5 голосов
/ 19 июня 2010

класс Отомобиль: IComparable

2 голосов
/ 19 июня 2010

Вот общий компаратор, который я использую довольно регулярно:

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
 }

Чтобы использовать это:

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

    }
}

Мне нравится этот класс, и я регулярно использую его в ASP.NETпотому что тогда я могу использовать (int)SortDirection.Ascending вместо 0 в качестве второго параметра, что облегчает его чтение.

Вы можете довольно легко изменить этот класс GenericComparer, чтобы он принимал параметр Func<> вместо строки всделать его удобным для рефакторинга.Конечно, это будет работать только со свойствами, которые реализуют IComparable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...