C# сортировка generic IEnumerable от List

У меня в методе есть переменная IEnumerable items, в которую приходит любая из моделей, с целью отсортировать ее по Position, пример:

if(sort == Sort.ASC){
    items = items.OrderBy("Position ASC");
}else{
    items = items.OrderBy("Position DESC")
}

Если явно указать модель var cars = items as IEnuberable<Cars>; То потом можно объявить List<int> ids со списком чисел и сделать такое:

cars = cars.OrderBy(x => ids.IndexOf(x.Id);

Но если у меня таких моделей 20+ штук, то делать так каждый раз - это много лишнего кода(но пока могу только так).

Можно ли это как то правильно написать, не указывая каждый раз модель?


Ответы (1 шт):

Автор решения: Alexander Petrov

Дайте угадаю.
Вам нужно в .OrderBy(x => ids.IndexOf(x.Id) использовать свойство Id у разных классов, не имеющих общего предка/интерфейса?

Думаю, такой метод позволит решить вашу задачу:

IEnumerable<T> GenericSort<T>(IEnumerable<T> items, Sort sort, Func<T, int> func)
{
    if (sort == Sort.ASC)
        return items.OrderBy(x => ids.IndexOf(func(x)));
    else
        return items.OrderByDescending(x => ids.IndexOf(func(x)));
}

Здесь ids поле класса, но можно сделать List<int> ids ещё одним параметром метода.

Вызывать следующим образом:

var sortedCars = GenericSort(cars, Sort.ASC, car => car.Id)

Вместо cars может быть коллекция любого типа. Соответственно, вместо car.Id объект с любым подходящим свойством.

→ Ссылка