Существует массив из объектов-наследников класса Car
: PassengerCar
, FreightCar
и SpecializedFreightCar
.
Нужно упорядочить массив по типам наследников. К примеру, сначала идут объекты PassengerCar
, затем FreightCar
, потом SpecializedFreightCar
.
PassengerCar
и FreightCar
наследуют черты класса Car
.
SpecializedFreightCar
наследует черты класса FreightCar
.
array.OrderBy(e =>
{
if (e is PassengerCar) return 0;
if (e is FreightCar) return 1;
//...
})
Но лучше добавить в классы свойство, типа такого:
public virtual int SortOrder => 0;
и сортировать по нему.
Если сортировка может использоваться в нескольких местах, рекомендую написать 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#" Роберт Мартин, Мика Мартин
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем привет! Допустим я хочу вывести данные после коннектора OleDbConnectionStringBuilderГде написать sql запрос и выполнить его значения?
Здравствуйте, товарищи! Уже давно мучаюсь с тем, что не могу ограничить обобщенные методы определёнными классамиИ вот вновь появилась такая...
Как сделать TabControl в стиле Materil DesignИспользую библиотеку MaterialDesignInXamltoolkit, но не понимаю, как на нем реализовать именно TabControl