2017-05-09 25 views
0

後、私は辞書のソートに問題がありますつまり、List.Count)は昇順で、lists.Countは同じですが、キーはアルファベット順にソートされます。誰かが私にこのことをどうやって考えさせることができますか?分類辞書は、値の後にキー

mySortedDictionary.Add("orange", List<2,9>) //List.Count = 2 
mySortedDictionary.Add("money", List<2,4,8,9>) //4 
mySortedDictionary.Add("monkey", List<2,4,9>) //3 
mySortedDictionary.Add("hokey", List<2,5,9>) //3 

//result: order in new sorted Dictionary// 
"orange", List<2,9> 
"hokey", List<2,5,9> 
"monkey", List<2,4,9> 
"money", List<2,4,8,9> 

ありがとうございました!

+0

辞書自体には注文がありません。たとえ特定の順序で辞書に挿入するアルゴリズムを思いついても、同じ順序でそれらを戻すという保証はありません。 – Partha

+0

@Partha 'SortedDictionary'は注文書を持っています(' key') –

答えて

0

SortedDictionaryデータを格納し、これは、それはすなわちそのカスタムで置き換えることができないに固有のものですrting。したがって、Dictionaryのようなインターフェイスが必要な場合は、カスタムのData構造を構築する必要があります。

ソート順のデータを頻繁に読み取る場合は、ソートされたデータを格納する(ソートされたデータと元のデータを別々にキャッシュする)仕組みを考案するか、ソートされた方法でデータを格納する必要があります。ディクショナリ内のValueはデータ構造の存続期間中に変更される可能性があるので、データを並べ替える必要があるかもしれません。これは簡単な運動ではないかもしれません。

しかし、実際にはDictionaryインターフェイスが一般的ですが、特定のシーケンスでデータを取得する必要がある場合は、以下の方法が役立ちます。

通常のデータをDictionaryに保存します。並べ替えられた順番でDictionaryのデータを取得するには、以下のような方法を用意します。

IOrderedEnumerable<KeyValuePair<string, List<int>>> GetSortedData() { 
    return mySortedDictionary.OrderBy(item => item.Value.Count).ThenBy(item => item.Key); 
} 
+0

ありがとう!!!それが私の言いたいことです。今度は私のアプリケーションが正常に動作します。 – garm

0

key部分(お客様の要件の一部)でのタイプは、SortedDictionaryであると考えていますが、OrderBy()メソッドを使用してカスタム注文を指定することもできます。これはディクショナリ内の要素の順序を変更するのではなく、指定した順序でIOrderedEnumerableを返します。したがって、注文を変更したい場合は、OrderBy呼び出しの結果に辞書を再割り当てする必要があります。それはあなたが何をしようとしてなら、多分これは役立ちます:

var mySortedDictionary = new SortedDictionary<string, List<int>> 
{ 
    {"orange", new List<int> {2, 9}}, 
    {"money", new List<int> {2, 4, 8, 9}}, 
    {"monkey", new List<int> {2, 4, 9}}, 
    {"hokey", new List<int> {2, 5, 9}} 
}; 

foreach (var item in mySortedDictionary.OrderBy(item => item.Value.Count)) 
{ 
    Console.WriteLine($"{item.Key} {string.Join(", ", item.Value)}"); 
} 

出力:

enter image description here

を辞書でこの順序を維持するために、あなたは次のように、再割り当てを行う必要がありますそう:key上でソートすることにより

mySortedDictionary = mySortedDictionary.OrderBy(item => item.Value.Count); 
0

あなたがSortedDictionaryを使用するように並べ替えがあるIComparableを実装するカスタムクラスを必要としています。

public class ncKey : IComparable { 
    public int count; 
    public string name; 

    public int CompareTo(object other) { 
     var b = other as ncKey; 
     var ans1 = count.CompareTo(b?.count); 
     return (ans1 == 0) ? name.CompareTo(b?.name) : ans1; 
    } 
} 

今、あなたは適切にソート辞書持っているクラスを使用することができます:あなたは本当にSortedListとのほうではないでしょうし、なぜあなたは辞書を使用している場合はもちろん

var newSD = new SortedDictionary<ncKey, List<int>>(); 

foreach (var kv in origSD) 
    newSD.Add(new ncKey { count = kv.Value.Count(), name = kv.Key }, kv.Value); 

を、私は疑問に思いますまったく。