Сортировка с помощью 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();
    }
Другие вопросы по тегам