web-dev-qa-db-ja.com

キーで辞書をソートする方法

辞書がありますDictionary<string, Point>

キーはc1、c3、c2、t1、、t4、t2です。c1、c2、c3、t1、t2、t3になるように並べ替えたい

私はそれを使用してソートしようとしています

Input.OrderBy(key => key.Key );

しかし、それは動作しません

それを解決する方法はありますか

28
AMH

Input.OrderByはディクショナリをソートしません。順序付けられた順序でアイテムを返すクエリを作成します。

おそらく OrderedDictionary はあなたが望むものを提供します。

または、Generic SortedDictionary を使用します

32
Erno de Weerd

次のように、ソートされていないオブジェクトをSortedDictionaryオブジェクトにロードします。

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);

UnsortedCustomerDataは同じジェネリック型(辞書文字列、文字列、または場合によっては文字列、ポイント)です。キーによって新しいオブジェクトを自動的にソートします

Msdnによると:SortedDictionary(IDictionary):指定されたIDictionaryからコピーされた要素を含むSortedDictionaryクラスの新しいインスタンスを初期化し、キ​​ータイプにデフォルトのIComparer実装を使用します。

10
sandman0615

単なる推測ですが、入力をソートすることを想定しているようです。 OrderByメソッドは、実際には同じ値を含むIOrderedEnumerableの順序付きインスタンスを返します。戻り値を保持する場合は、以下を実行できます。

IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)

コレクションを変更するほとんどのメソッドは、この同じパターンに従います。これにより、元のコレクションインスタンスが変更されないようにします。これにより、意図しないときに誤ってインスタンスを変更することを防ぎます。ソートされたインスタンスのみを使用する場合は、上記のように変数をメソッドの戻り値に設定するだけです。

5
Beth Whitezel

Input.OrderByは、順序付けられた順序でアイテムを返すクエリを作成するため、同じディクショナリに割り当てます。

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);

次のコードは、さらに2つの list sから sort 辞書を使用します。

using System;
using System.Collections.Generic;
using System.Drawing;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Dictionary<string,Point> r=new Dictionary<string,Point>();
            r.Add("c3",new Point(0,1));
            r.Add("c1",new Point(1,2));
            r.Add("t3",new Point(2,3));
            r.Add("c4",new Point(3,4));
            r.Add("c2",new Point(4,5));
            r.Add("t1",new Point(5,6));
            r.Add("t2",new Point(6,7));
            // Create a list of keys
            List<string> zlk=new List<string>(r.Keys);
            // and then sort it.
            zlk.Sort();
            List<Point> zlv=new List<Point>();
            // Readd with the order.
            foreach(var item in zlk) {
                zlv.Add(r[item]);
            }
            r.Clear();
            for(int i=0;i<zlk.Count;i++) {
                r[zlk[i]]=zlv[i];
            }
            // test output
            foreach(var item in r.Keys) {
                Console.WriteLine(item+" "+r[item].X+" "+r[item].Y);
            }
            Console.ReadKey(true);
        }
    }
}

上記のコードの出力を以下に示します。

c1 1 2
c2 4 5
c3 0 1
c4 3 4
t1 5 6
t2 6 7
t3 2 3
2
Jorney Huang

使った

var l =  Input.OrderBy(key => key.Key);

それを辞書に変換しました

0
AMH