2

リストがあり、ユーザーが列ヘッダーのハイパーリンクをクリックするのを模倣するために、現在とは逆の順序で結果を並べ替えたいと思います。現在、私は次のことをしています:

 dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName));

しかし、これは昇順でのみソートされます。私は降順で並べ替えることを知っています:

 dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*-1);

しかし、私はそれが現在何であるかを検出し、どの種類を実行するかを決定する必要はありません。

わかる?

グラシアス。

明確にするために、並べ替え可能な列が複数あるため、Reverseを使用できません。そのため、並べ替える値を指定する機能が必要です。

以下は機能しますが、null値の場合は機能しません。空白がある場合、ソートはスタックします。

  dsList.Sort((x, y) => String.CompareOrdinal(x.Surname, y.Surname) * (strB != null && (strA != null && String.Compare(strA, strB) == -1) ? -1 : 1));
4

3 に答える 3

1

どうですか

dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*(dsList[0] < dsList[1]?-1:1));

編集:あなたのコメントでは、重複またはnull値があるときに問題が発生しているようです...これで修正されるはずです

dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*String.CompareOrdinal(dsList[0].DisplayName, dsList[dsList.Length-1].DisplayName));
于 2013-01-16T02:30:43.450 に答える
1

Linq拡張Reverse()を使用してみませんか?これにより、現在の並べ替えを知らなくても、昇順と降順を切り替えることができます。これを使用する場合は、ライブラリを参照し、ソースファイルの先頭でSystem.Coreusingディレクティブを宣言していることを確認してください。System.Linq

もう1つの方法は、Listから継承するクラスを作成し、次のように少し変更することです。

public class LazyReversingList<T> : IList<T>
{
    private Boolean m_SortedAscending;
    private List<T> m_InnerList;

    public Boolean IsReadOnly
    {
        get
        {
            return false;
        }
    }

    public Boolean SortedAscending
    {
        get
        {
            return m_SortedAscending;
        }
    }

    public Int32 Count
    {
        get
        {
            EnsureList();
            return m_InnerList.Count;
        }
    }

    public T this[Int32 index]
    {
        get
        {
            EnsureList();
            return m_InnerList[index];
        }
        set
        {
            EnsureList();
            m_InnerList[index] = value;
        }
    }

    private void EnsureList()
    {
        if (m_InnerList == null)
            m_InnerList = new List<T>();
    }

    public Boolean Contains(T item)
    {
        EnsureList();
        return m_InnerList.Contains(item);
    }

    public Boolean Remove(T item)
    {
        EnsureList();
        return m_InnerList.Remove(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        EnsureList();
        return m_InnerList.GetEnumerator();
    }

    public Int32 IndexOf(T item)
    {
        EnsureList();
        return m_InnerList.IndexOf(item);
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        EnsureList();
        return m_InnerList.GetEnumerator();
    }

    public void Add(T item)
    {
        EnsureList();
        m_InnerList.Add(item);
    }

    public void Clear()
    {
        EnsureList();
        m_InnerList.Clear();
    }

    public void CopyTo(T[] array, Int32 arrayIndex)
    {
        EnsureList();
        m_InnerList.CopyTo(array, arrayIndex);
    }

    public void Insert(Int32 index, T item)
    {
        EnsureList();
        m_InnerList.Insert(index, item);
    }

    public void RemoveAt(Int32 index)
    {
        EnsureList();
        m_InnerList.RemoveAt(index);
    }

    public void Reverse()
    {
        if (!m_SortedAscending)
        {
            m_InnerList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName));
            m_SortedAscending = true;
        }
        else
        {
            m_InnerList.Sort((x, y) => (String.CompareOrdinal(x.DisplayName, y.DisplayName) * -1));
            m_SortedAscending = false;
        }
    }
}
于 2013-01-16T02:18:52.117 に答える
0

毎回現在の順序を逆にするだけの場合は、.NetのLINQで使用できるReverseメソッドの使用を検討する必要があります。

また

前後の方向に値を渡すだけで済みます。これにより、ソート動作をページの目的の状態にバインドできるようになります。これは、非表示フィールドを考慮しているためです。

于 2013-01-16T02:18:08.203 に答える