Я написал метод расширения, который может принимать произвольное число или OrderBy () и применять их рекурсивно ....
Вероятно, лучше показать пример:
public static IEnumerable<User> ApplyOrdering(this IEnumerable<User> users,
int index,
params Func<User, string>[] sorts)
{
if(index == sorts.Length)
return users;
users = users.OrderBy(sorts[index]);
index++;
return users.ApplyOrdering(index, sorts);
}
// And it's called like this:
void Example()
{
var users = GetUnsortedUsers();
var sortedUsers = users.ApplyOrdering(0, u => u.DisplayName,
u => u.Username,
u => u.Email);
}
Не так много вопросов, но я хочу знать, можно ли это сделать лучше и элегантнее?
С одной стороны, мне не нравится объявлять начальный индекс ввызов метода.Другой возможный придирка - это вызов .ApplyOrdering () в последний раз, чтобы просто вернуть пользователей.
Что ты думаешь ?!Я хотел бы увидеть некоторые из умных решений, которые вы, гуру C #, придумали!
РЕДАКТИРОВАТЬ: Я знаю, что некоторые из вас укажут, что лучше и выразительнее просто писать запросы, такие какэто:
var orderedUsers = users.OrderBy(u => u.DisplayName)
.ThenBy(u => u.Username)
.ThenBy(u => u.Email);
Но в моем сценарии количество и тип фильтров не всегда одинаковы, поэтому мне нужно было универсальное решение, которое могло бы вместить любое количество фильтров.