0

コードにがありSortedListます。その中にキーと値のペアを入力します。アイテムを追加するとSortedList、キーで自動的に並べ替えられます。しかし、私はそれを値でソートする必要があります。値はコンボボックスに表示されるテキストであるためです。それらはアルファベット順にソートする必要があります。クラスを作成してクラスから継承し、メソッドSortedListをオーバーライドすることにしましたAdd

しかし、MicrosoftのSortedListクラスのコードを見ると、Insertメソッドがあり、それによって並べ替えが行われ、残念ながらプライベートであるため、オーバーライドできません。これについて私を助けてくれませんか?

注:ArrayListまたはDictionaryまたは他のものを使用することはできません。プロジェクトのすべてのコードを管理することはできません。から派生した' SortedList'または''を返す必要がありますMySortedListSortedList

4

1 に答える 1

2

私の最初の提案はカスタム比較器を使用することでしたが、彼は問題を解決しませんでした。したがって、SortedListの実装をより詳細に調査し、元の投稿を次の提案に置き換えました。

Addメソッドをオーバーライドし、リフレクションを使用してプライベートInsertを呼び出すと、トリックが実行されます。

private MySortedList()
{
}

public override void Add(object key, object value)
{
    if (key == null || value == null)
    {
        //throw new ArgumentNullException("key", Environment.GetResourceString("ArgumentNull_Key"));
        throw new ArgumentNullException(); // build your own exception, Environment.GetResourceString is not accessible here
    }

    var valuesArray = new object[Values.Count];
    Values.CopyTo(valuesArray , 0);

    int index = Array.BinarySearch(valuesArray, 0, valuesArray.Length, value, _comparer);
    if (index >= 0)
    {
        //throw new ArgumentException(Environment.GetResourceString("Argument_AddingDuplicate__", new object[] { this.GetKey(index), key }));
        throw new ArgumentNullException(); // build your own exception, Environment.GetResourceString is not accessible here
    }

    MethodInfo m = typeof(SortedList).GetMethod("Insert", BindingFlags.NonPublic | BindingFlags.Instance);
    m.Invoke(this, new object[] {~index, key, value});
}
于 2012-11-16T10:49:01.077 に答える