Существует массив из объектов-наследников класса 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#" Роберт Мартин, Мика Мартин
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости