汎用シリーズ<7>Sorted Listの内容を反転

5460 ワード

4.8 Sorted Listの内容を反転する
に質問
SortedListとSortedListクラスの元の機能を維持しながら、sorted listの内容を配列とリストタイプで反転させることができます.SortedListも汎用SortedListクラスも、リストを再記入する必要がなく、この機能を完了する方法を直接提供します.
ソリューション
ReversibleSortedListクラスはこれらの機能を提供しており、SortedListクラスに基づいているので、同じ機能を持っており、ソートされたリストを簡単に反転させることができる追加の機能を提供しています.
ReversibleSortedListをインスタンス化した後、キーは整数タイプであり、値は文字列タイプであり、一連の無秩序な数字とそれらのテキスト表現がリストに挿入される.これらの項目は次のように表示されます.
ReversibleSortedList rsl = new ReversibleSortedList();
rsl.Add(2, "2");
rsl.Add(5, "5");
rsl.Add(3, "3");
rsl.Add(1, "1");
foreach (KeyValuePair kvp in rsl)
{
    Debug.WriteLine("\t"+ kvp.Key + "\t"+ kvp.Value);
}
リスト出力は昇順で表示されます(デフォルト):
    1   1
    2   2
    3   3
    5   5

配列順序は、ReversibleSortedListのSortDirection属性を設定することによって降順に反転されます.並べ替えのためにSort()メソッドを呼び出す必要があります.結果は次のとおりです.
//並べ替え方向を変換する.
rsl.Comparer.SortDirection = ListSortDirection.Descending;
//リストを並べ直す.
rsl.Sort();
foreach (KeyValuePair kvp in rsl)
{
    Debug.WriteLine("\t"+ kvp.Key + "\t"+ kvp.Value);
}
今回、出力は降順です.
    5   5
    3   3
    2   2

1   1
新しいアイテムをリストに追加すると、現在のソート順に追加されますが、すべてのアイテムを追加した後すぐに反転し、リスト内の要素の順序を維持できます.
    rsl.Add(4, "4");
    foreach (KeyValuePair kvp in rsl)
    {
        Debug.WriteLine("\t"+ kvp.Key + "\t"+ kvp.Value);
    }
//並べ替え方向を変換する.
    rsl.Comparer.SortDirection = ListSortDirection.Ascending;
//リストを並べ直す.
    rsl.Sort();
    foreach (KeyValuePair kvp in rsl)
    {
        Debug.WriteLine("\t"+ kvp.Key + "\t"+ kvp.Value);
}
新しいアイテムは降順でも昇順でも表示されます.
    5   5
    4   4
    3   3
    2   2
    1   1
    1   1
    2   2
    3   3
    4   4
    5   5

 
ReversibleSortedListは、IComparerインタフェースを実装するネストされたクラスSortDirectionComparerを含む.このクラスは、「ディスカッション」セクションのReversibleSortedListコードで参照できます.IComparerインタフェースを実装するクラスは、デフォルトのソートを変更するために、ReversibleSortedList構築方法のパラメータとすることができる.IComparerインタフェースは、Compareメソッドを実装します.
class Program
    {
        public int Compare(T lhs, T rhs)
        {
            int compareResult =
                lhs.ToString().CompareTo(rhs.ToString());
//降順の場合は反転
            if (SortDirection == ListSortDirection.Descending)
                compareResult *= -1;
            return compareResult;
        }
}
Compareメソッドでは、SortDirectionComparerクラスのSortDirectionプロパティを使用してアイテムのソートを決定します.この属性は、ReversibleSortedListの内部クラスSortDirectionComparerインスタンスで設定されます.SortDirectionプロパティは、構築方法で設定されます.コードは次のとおりです.
    public ReversibleSortedList()
    {
        this.keys = ReversibleSortedList.emptyKeys;
        this.values = ReversibleSortedList.emptyValues;
        this._size = 0;
        this._sortDirectionComparer = new SortDirectionComparer();
        this._currentSortDirection = this._sortDirectionComparer.SortDirection;
}
これにより、指定した時間内に並べ替え順序を反転できますが、リストにすでに存在するアイテムは並べ替えられません.この機能を実現するには、Reversible-SortedListクラスに新しいSort()メソッドを追加してリストを並べ替える必要があります.コードは次のとおりです.
public void Sort()
{
//既存のソート方向と同じかどうかをチェックする.
    if (this._currentSortDirection != this._sortDirectionComparer.SortDirection)
    {
//違う場合は反転する.
        Array.Reverse(this.keys, 0, this._size);
        Array.Reverse(this.values, 0, this._size);
//現在のソートを設定する.
        this._currentSortDirection = this._sortDirectionComparer.SortDirection;
     }
}