3

以前に並べ替えられた列に応じて、テーブルのいくつかの列を並べ替えようとしています。最初の 2 つの列では正常に機能します。しかし、3 番目の列を並べ替えるとすぐに、2 番目の列の並べ替えが失われます。今のところ私の知る限り、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 のリストです

4

2 に答える 2

3

あなたはDictionary;を渡しています。(ループDictionaryのように) として使用するときに a から値を取得する順序は、(おそらく)それらを追加した順序ではありません!IEnumerable<KeyValuePair>foreach

の代わりにList<KeyValuePair>(またはその他の順序付けられた )を使用するか、カスタム クラスを作成してフィールドと方向を保持し、その を渡す必要があります。IEnumerable<KeyValuePair>DictionaryList

于 2012-11-23T11:09:29.193 に答える
1

こちらもご覧ください

コードをもう少し明確にするためです。すべてを 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();
    }
于 2012-11-23T11:32:30.210 に答える