0

IDictionary が正確にどのタイプであるかを知らずに IDictionary を注文する方法があるかどうかを知る必要があります...

たとえば、オブジェクトを受け取ったメソッドがあり、この中に Dictionary オブジェクトがあります...私が知っているのは、それが Dictionary であることだけなので、これを行うことができます:

public void MyMethod(PropertyInfo propriedadeParametro, object parameters){
   IDictionary dictionary = ((IDictionary) propriedadeParametro.GetValue (parameters, null));
}

ただし、この Dictionary の項目を EnumPersonalizado でソートする必要がありますが、他のタイプの「何か」に関係なく、もっている

4

4 に答える 4

4

辞書を並べ替えることはできません。辞書には、定義上、その中の項目の「順序」がありません。アイテムは、追加、削除、および検索を可能な限り効率的に行うように設計された、制御できないメカニズムに保存されます。

あなたができる最善の方法は、辞書からすべての項目を取り出し、それらを別の種類のコレクションに入れ、それを並べ替えることです。

あなたの特定のケースに関しては、ディクショナリのキーまたは値のタイプが何であるかは明確ではありません。データをソートするには、それを知る必要があります。

于 2013-02-15T16:21:57.197 に答える
1

この質問を参照してください。辞書自体にはインデックスの順序がありません。代わりに KeyedCollection クラスから継承することを検討してください。これは、辞書と通常のリストのマージであり、項目のメンバーをキーとして使用し、インデックス順を持つように設計されています。

于 2013-02-15T16:22:45.730 に答える
1

キーに基づいて部分的な順序付けを辞書に適用したい正当な理由はたくさんあります。キーが順序付けられていないことは基本的な性質ではなく、特定のキーが特定の値を生成するということだけです。

そうは言っても、非ジェネリックIDictionaryを使用している場合、キーの種類を知らずにキーで「並べ替える」のは実際には非常に面倒です。私の特定のシナリオでは、順序付けられたキーによってエントリを列挙できる IDictionary を別の IDictionary に変換する関数が必要でした。

IDictionary ToSortedDictionary(IDictionary dictionary) {
    return new SortedList(dictionary);
}

これにより、トラバーサル ( foreach) がキーの並べ替え順序に基づいてエントリを参照するように、新しい辞書インスタンスが構築されます。

奇妙な名前のSortedListSystem.Collectionsは、インターフェイスを使用してキーと順序付けで見つけることができÌComparableます。

于 2014-06-13T17:58:14.223 に答える
-2

IDictionary は IEnumerable であるため、 のようなことを試みることができますがnew ArrayList(dictionary).Sort()、メンバーを IComparable にキャストしようとするか、IComparer オブジェクトを受け入れる Sort オーバーロードを使用できます。もう 1 つの方法は、リフレクションを使用することです。まず、実際のキー/値の型を見つけてから、汎用の OrderBy への呼び出しを作成します。

于 2013-02-15T16:11:48.053 に答える