2017-02-09 3 views
0

私は(C#を使用して)の辞書があります。キーがリスト(C#の場合)であれば、キーで辞書をソートする方法は?

key: {"3", "1", "45"}, value: "test value 1" 
key: {"1", "2", "45"}, value: "test value 2" 
key: {"11", "1", "45"}, value: "test value 3" 
key: {"1", "1", "45"}, value: "test value 4" 

キーは文字列のリストであり、それは常にであります:辞書は既に(例えば)値を持つ

Dictionary<List<string>, string> dictData = new Dictionary<List<string>, string>(); 

を少なくとも2つの要素。私がする必要があるのは、キーによるソートを行うこと、またはより正確には、リストの最初の要素でソートすることと、リストの2番目の要素でソートする2番目の基準とすることです。文字列は実際には数値なので、数値としてソートする必要があります( "3"は "11"より小さくする必要があります)。再び

key: {"1", "1", "45"}, value: "test value 4" 
key: {"1", "2", "45"}, value: "test value 2" 
key: {"3", "1", "45"}, value: "test value 1" 
key: {"11", "1", "45"}, value: "test value 3" 

:だから、上記の例のために、私は次のような結果を得る必要があり、キーは、実際の最初の要素によって実行されるリストとソートであればどのように私は、キーによって辞書を並べ替えることができますリスト、次にリストの2番目の要素によって定義されます。

+8

辞書のキーとして 'List'をキーとして使用しないことを強くお勧めします。 – Jonesopolis

+2

キーが数字であり、そのように扱われる必要がある場合、なぜ文字列のリストを使用していますか? –

+1

リストを辞書キーとして使用している以外は、本当に必要な場合は、カスタム比較者で 'SortedDictionary'を使うことができますか? – Brandon

答えて

0

あなたが本当にあなたの現在の設定のように、それが必要な場合は、この作品(テストコードを、それを調整する必要があります)。元の回答に似ていますが、それは完全なリスト(最大3と仮定)だけです。テストされ、動作しているようです。あなたは、これはあなたが軌道に乗るために単にベースのセットアップであるなど、それはすべての3を持っていない場合のためのロジックを追加する必要があります。

private void DoIt() 
    { 
     Dictionary<List<string>, string> test = new Dictionary<List<string>, string>(); 
     List<string> workerList = new List<string>() { "3", "1", "45" }; 
     test.Add(workerList, "test value 1"); 
     workerList = new List<string>() { "1", "2", "45" }; 
     test.Add(workerList, "test value 2"); 
     workerList = new List<string>() { "11", "1", "45" }; 
     test.Add(workerList, "test value 3"); 
     workerList = new List<string>() { "1", "1", "45" }; 
     test.Add(workerList, "test value 4"); 


     foreach(KeyValuePair<List<string>,string> kvp in test.OrderBy(x => int.Parse(x.Key[0])).ThenBy(y => int.Parse(y.Key[1])).ThenBy(z => int.Parse(z.Key[2]))) 
     { 
      Console.WriteLine("Key: " + kvp.Key[0].ToString() + "," + kvp.Key[1].ToString() + "," + kvp.Key[2].ToString() + " | " + "Value: " + kvp.Value.ToString()); 
     } 
    } 

出力:

Key: 1,1,45 | Value: test value 4 
Key: 1,2,45 | Value: test value 2 
Key: 3,1,45 | Value: test value 1 
Key: 11,1,45 | Value: test value 3 
4

List<int>に1,2,5および1,2,5が含まれている場合、その2つのリストは同じリストではありません。それらは別々のリストインスタンスであり、リスト(配列を含む他のコレクション型のような)はの参照型であるため、同じ順序で同じ値を含むことになります。辞書はそれらを異なるキーとして扱うので、それらを一意のキーとして使用することはできません。

私は、あなたの3つの値を含み、それをキーとして使用するstructを作成することをお勧めします。理由は構造体が値タイプであり、同じプロパティ値を持つ2つのインスタンスが等しいとみなされるためです。これは辞書キーに必要なものです。

struct Values 
{ 
    public int First { get; set; } 
    public int Second { get; set; } 
    public int Third { get; set; } 
} 

次に、あなたがこれを行うことができます:

var x = new Dictionary<Values, string>() 
    { 
     {new Values() {First = 1, Second = 1, Third = 45}, "test value 1"}, 
     {new Values() {First = 1, Second = 2, Third = 45}, "test value 2"}, 
     {new Values() {First = 11, Second = 1, Third = 45}, "test value 3"}, 
    }; 

var sorted = x.OrderBy(kvp => kvp.Key.First).Select(kvp => kvp.Value); 
0

をリストを使用するには辞書のキーとして、あなたはその後、型として辞書を使用し、この

public class DictionaryKeyList { 

    public List<string> Lst { get; set; } 

    public override bool Equals(Object otherObj){ 
     var otherList = otherObj as DictionaryKeyList; 

     return !this.Lst.Zip(otherList, (a,b) => a == b).Any(x => !x); 
    } 

ような何かを行うことができます

Dictionary<DictionaryKeyList, string> dictData; 
関連する問題