Как упорядочить массив по типам?

163
06 марта 2018, 01:36

Существует массив из объектов-наследников класса Car: PassengerCar, FreightCar и SpecializedFreightCar.

Нужно упорядочить массив по типам наследников. К примеру, сначала идут объекты PassengerCar, затем FreightCar, потом SpecializedFreightCar.

PassengerCar и FreightCar наследуют черты класса Car.

SpecializedFreightCar наследует черты класса FreightCar.

Answer 1
array.OrderBy(e =>
{
    if (e is PassengerCar) return 0;
    if (e is FreightCar) return 1;
    //...
})

Но лучше добавить в классы свойство, типа такого:

public virtual int SortOrder => 0;

и сортировать по нему.

Answer 2

Если сортировка может использоваться в нескольких местах, рекомендую написать Comparer, например:

class CarComparer : IComparer<Car>
{
    static Dictionary<Type, int> priorities = new Dictionary<Type, int>();
    static CarComparer()
    {
        priorities.Add(typeof(PassengerCar), 1);
        priorities.Add(typeof(FreightCar), 2);
        priorities.Add(typeof(SpecializedFreightCar), 3);
    }
    int PriorityFor(Type type)
    {
        priorities.TryGetValue(type, out int p);
        return p;
    }
    public int Compare(Car x, Car y)
    {
        int priorityX = PriorityFor(x.GetType());
        int priorityY = PriorityFor(y.GetType());
        return priorityX.CompareTo(priorityY);
    }
}

Пример использования:

Car[] cars =
{
    new SpecializedFreightCar(),
    new FreightCar(),
    new FreightCar(),
    new PassengerCar(),
    new SpecializedFreightCar()
};
Array.Sort(cars, new CarComparer());
Console.WriteLine(string.Join<Car>("\n", cars));

Код почти дословно скопирован из книги "Принципы, паттерны и методики гибкой разработки на языке C#" Роберт Мартин, Мика Мартин

READ ALSO
Вывод данных через OleDbDataAdapter

Вывод данных через OleDbDataAdapter

Всем привет! Допустим я хочу вывести данные после коннектора OleDbConnectionStringBuilderГде написать sql запрос и выполнить его значения?

195
Объединение методов для int, long, double, BigInteger в один

Объединение методов для int, long, double, BigInteger в один

Здравствуйте, товарищи! Уже давно мучаюсь с тем, что не могу ограничить обобщенные методы определёнными классамиИ вот вновь появилась такая...

187
Material Design TabControl

Material Design TabControl

Как сделать TabControl в стиле Materil DesignИспользую библиотеку MaterialDesignInXamltoolkit, но не понимаю, как на нем реализовать именно TabControl

191
Где должны хранится запросы к БД?

Где должны хранится запросы к БД?

Да, я знаю, что запросы к БД должны хранится в отдельном слое

190