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 шт):
Дайте угадаю.
Вам нужно в .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 объект с любым подходящим свойством.