Сортировка с помощью OrderBy, ThenBy
Я пытаюсь отсортировать несколько столбцов таблицы в зависимости от предыдущего отсортированного столбца. Он отлично работает для первых двух столбцов. Но как только я сортирую третий столбец, второй теряет свой вид. Насколько я знаю, сейчас должна быть проблема с моим циклом foreach. Вот мой код для сортировки:
public List<object> inhaltSortieren(List<object> zuSortierendeListe, Dictionary<string, SortierRichtung> sortierung)
{
IOrderedEnumerable<object> sortierteListe = null;
if (sortierung.First().Value == SortierRichtung.asc)
sortierteListe = zuSortierendeListe.OrderBy(x => x.GetType().GetProperty(sortierung.First().Key).GetValue(x, null));
else if (sortierung.First().Value == SortierRichtung.desc)
sortierteListe = zuSortierendeListe.OrderByDescending(x => x.GetType().GetProperty(sortierung.First().Key).GetValue(x, null));
bool first = true;
foreach (KeyValuePair<string, SortierRichtung> spalte in sortierung)
{
if (first)
{
first = false;
continue;
}
if (spalte.Value == SortierRichtung.asc)
sortierteListe = sortierteListe.ThenBy(x => x.GetType().GetProperty(spalte.Key).GetValue(x, null));
else if (spalte.Value == SortierRichtung.desc)
sortierteListe = sortierteListe.ThenByDescending(x => x.GetType().GetProperty(spalte.Key).GetValue(x, null));
}
return sortierteListe.ToList();
}
Есть идеи?
Обновление: Может быть, я добавлю дополнительную информацию:
- @param zusortierendeListe: это список, который я хочу отсортировать, это список объектов
- @param sortierung: это направление, которое я хочу отсортировать, по возрастанию или по убыванию
Сами объекты являются списками табличных данных.
2 ответа
Вы проходите в Dictionary
; порядок, в котором вы получаете значения из Dictionary
когда вы используете его как IEnumerable<KeyValuePair>
(как твой foreach
цикл делает) это (вероятно) не тот порядок, в котором вы их добавили!
Вам нужно будет использовать List<KeyValuePair>
(или какой-то другой заказанный IEnumerable<KeyValuePair>
) вместо Dictionary
или даже создать собственный класс для хранения поля и направления и передать List
того, что.
Также посмотрите здесь
Просто чтобы сделать ваш код немного более понятным. Вы можете поместить все в цикл for-each или оставить все как есть, но затем использовать sortierung.Skip(1) в своем коде, потому что вы уже использовали первую запись. Я также изменил аргумент Dictionary на IEnumerable> в соответствии с предыдущим комментарием.
object GetValue(object value, string name)
{
return value.GetType().GetProperty(name).GetValue(value, null);
}
public List<object> SortContent(List<object> listToSort, Tuple<string, SortDirection>[] sortInfos)
{
if (sortInfos == null || sortInfos.Length == 0)
return listToSort;
IOrderedEnumerable<object> sortedList = null;
foreach (var column in sortInfos)
{
Func<object, object> sort = x => GetValue(x, column.Key);
bool desc = column.Value == SortDirection.Descending;
if (sortedList == null)
sortedList = desc ? listToSort.OrderByDescending(sort) : listToSort.OrderBy(sort);
else
sortedList = desc ? sortedList.ThenByDescending(sort) : sortedList.ThenBy(sort);
}
return sortedList.ToList();
}