Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

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

#c_sharp #сортировка


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

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

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

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


Ответы

Ответ 1



array.OrderBy(e => { if (e is PassengerCar) return 0; if (e is FreightCar) return 1; //... }) Но лучше добавить в классы свойство, типа такого: public virtual int SortOrder => 0; и сортировать по нему.

Ответ 2



Если сортировка может использоваться в нескольких местах, рекомендую написать Comparer, например: class CarComparer : IComparer { static Dictionary priorities = new Dictionary(); 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("\n", cars)); Код почти дословно скопирован из книги "Принципы, паттерны и методики гибкой разработки на языке C#" Роберт Мартин, Мика Мартин

Комментариев нет:

Отправить комментарий