2

シーケンスで並べられたテーブルの名前を持つリスト (myList) があります。MyObject には、Table (文字列) と Sequence (int) の 2 つのプロパティがあります。

List<MyObject>

例:

List<MyObject>[0] = MyObject.Sequence = 0, MyObject.Table = "Cat" 
List<MyObject>[1] = MyObject.Sequence = 1, MyObject.Table = "Dog" 
List<MyObject>[2] = MyObject.Sequence = 2, MyObject.Table = "Bird" 
List<MyObject>[3] = MyObject.Sequence = 3, MyObject.Table = "Fish" 

次に、値としてテーブルと EntityObject を持つ構造体キーを持つディクショナリを取得したため、このディクショナリには、このような 10 個のオブジェクト値が既に入力されています。

dict[0] = key (ID = 1, Table = "Cat" ), EntityObject = Cat 
dict[1] = key (ID = 2, Table = "Dog"), EntityObject = Dog 
dict[2] = key (ID = 3, Table = "Bird"), EntityObject = Bird 
dict[3] = key (ID = 4, Table = "Fish"), EntityObject = Fish 
dict[4] = key (ID = 5, Table = "Cat" ), EntityObject = Cat 
dict[5] = key (ID = 6, Table = "Dog"), EntityObject = Dog 
dict[6] = key (ID = 7, Table = "Cat" ), EntityObject = Cat 
dict[7] = key (ID = 8, Table = "Dog"), EntityObject = Dog 
dict[8] = key (ID = 9, Table = "Cat" ), EntityObject = Cat 
dict[9] = key (ID = 10, Table = "Fish"), EntityObject = Fish

だから、テーブルシーケンスを含むリストに従って辞書を並べ替え、辞書を再構築してこのようにしたい

dict[0] = key (ID = 1, Table = "Cat"), EntityObject = Cat 
dict[1] = key (ID = 5, Table = "Cat"), EntityObject = Cat 
dict[2] = key (ID = 7, Table = "Cat"), EntityObject = Cat 
dict[3] = key (ID = 9, Table = "Cat"), EntityObject = Cat 
dict[4] = key (ID = 2, Table = "Dog"), EntityObject = Dog 
dict[5] = key (ID = 6, Table = "Dog"), EntityObject = Dog 
dict[6] = key (ID = 8, Table = "Dog"), EntityObject = Dog 
dict[7] = key (ID = 3, Table = "Bird"), EntityObject = Bird 
dict[8] = key (ID = 4, Table = "Fish"), EntityObject = Fish 
dict[9] = key (ID = 10, Table = "Fish"), EntityObject = Fish

foreach でループを回避し、新しい辞書を再作成してから、既存の辞書にコピーまたは複製したいと考えています。それで、私はこれを一瞬飛ばしてみましたが、いつも同じソートされていないリストを取得しました. Sort または OrderBy メソッドが欠落している可能性がありますが、誰かがこれを修正するのに役立ちます。提案?

Dictionary<MyStruct, EntityObject> dict = this.GetDictionary()
    .ToList()
    .FindAll(x => x.Key.Table == myList.Find(y => y.Table == x.Key.Table).Table)
    .ToDictionary(a => a.Key, b => b.Value);

ノート:

ディクショナリをソートできないことは既に知っていますが、私のアプローチを見ると、新しいディクショナリを再作成して、メモリ内の要素を並べ替えて「dict」に割り当てようとしています。

- -編集 - -

最近この変更を加えましたが、まだ何もありません。助けてください。

Dictionary<MyStruct, EntityObject>
        dict = this.GetDictionary()
                .ToList()
                .OrderBy(x => x.Key.Table == myList
                .Find(z => z.Table == x.Key.Table).Table)
                .ToDictionary(x => x.Key, y => y.Value);
4

2 に答える 2

2

辞書は、キーによる値の高速検索を目的としています。したがって、辞書は検索目的で内部ストレージを最適化するため、基本的に、辞書は順序付けられていないデータ構造です。ハッシュベースの検索 ( など) を使用する他のコンテナーにも同じことが当てはまりますHashSet

アイテムをディクショナリに追加すると、指定されたキーのハッシュコードが計算され、計算されたハッシュコードに対応するバケットに値が配置されます。コレクションの末尾に値を追加しません (たとえば、 と比較しますList<T>)。したがって、「順序」またはアイテムは、キーのハッシュコードのみによって決定されます。

一部のアイテムの順序を保持したい場合 (より正確には、インデックスでアイテムにアクセスする機能が必要な場合)、それでもディクショナリを使用するには、OrderedDictionaryまたはのような特別な実装が必要KeyedCollectionです。

于 2013-11-09T17:48:28.107 に答える
0

をソートすることはできませんDictionary<K, V>。これは、ハッシュ テーブルに基づいています。ソート順は、ハッシュ キーと使用されるアルゴリズムによって異なります。これにより、予測不可能な順序が生成されます。

がありますが、SortedDictionary<K, V>それはキーでソートされています。それはあなたが望むものではありません。

並べ替えにシーケンス番号を使用するには、それらをテーブル名で辞書に格納する必要があります。

var tableSequence = new Dictionary<string, int>();
tableSequence.Add("Cat", 0);
tableSequence.Add("Dog", 1);
...

次に、この情報を使用してエンティティ オブジェクトを並べ替えることができます。

Dictionary<MyStruct, EntityObject> dict = this.GetDictionary();
var orderedList = dict
    .OrderBy(x => tableSequence[x.Key.Table])
    .ToList();

この情報を辞書に保存すると、並べ替え順序が乱れます。


もありますがSystem.Collections.Specialized.OrderedDictionary、それは一般的ではありません。注: 並べ替えではなく、順序付けされています。これは、要素が入力した順序で格納されることを意味します。したがって、基本的には、事前に並べ替えられた要素を 1 つずつループに追加する必要があります。その後、インデックスまたはキーによって要素にアクセスできます。

于 2013-11-09T18:00:24.060 に答える