簡體   English   中英

使用OrderBy,ThenBy進行排序

[英]Sorting with 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:這是我想要排序,升序或降序的方向

對象本身是Tabledata的列表

你傳入一本Dictionary ; 當你將它作為IEnumerable<KeyValuePair> (正如你的foreach循環那樣)使用它從Dictionary獲取值的順序(可能) 不是你添加它們的順序!

您需要使用List<KeyValuePair> (或其他一些有序的 IEnumerable<KeyValuePair> )而不是Dictionary ,或者甚至創建一個自定義類來保存字段和方向並傳遞List of that。

看看這里

只是為了讓你的代碼更清晰一些。 您可以將所有內容放入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();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM