2010-10-23 148 views
1

第一Dictionary就像C#:字典的轉換<字符串,字符串>到詞典<字符串,字典<字符串,字符串>>

 Dictionary<String, String> ParentDict = new Dictionary<String, String>(); 
     ParentDict.Add("A_1", "1"); 
     ParentDict.Add("A_2", "2"); 
     ParentDict.Add("B_1", "3"); 
     ParentDict.Add("B_2", "4"); 
     ParentDict.Add("C_1", "5"); 

我需要此轉換爲一個新的Dictionary<String, Dictionary<String,String>>

結果將包含

Key     Value 

       Key     Value    
_________________________________________________ 

"A"    "A_1"     "1" 
       "A_2"     "2" 

"B"    "B_1"     "1" 
       "B_2"     "2" 

"C"    "C_1"     "1" 

現在我使用nested for loop來做到這一點。

我如何使用LNQLAMBDA Expression來做到這一點?

+0

爲什麼你需要這個數據結構? – 2010-10-23 14:26:31

+0

我問的原因是嵌套字典通常比帶有複合鍵或查找的單深度字典慢和不太合適。 – 2010-10-23 14:29:31

回答

5
var result = ParentDict.GroupBy(p => p.Key[0].ToString()) 
         .ToDictionary(g => g.Key, g => g.ToDictionary(x => x.Key, x => x.Value)); 
+1

+1做什麼問。 – 2010-10-23 14:29:54

1

嘗試:

var result = from p in ParentDict 
      group p by p.Key[0] into g 
      select new { Key = g.Key, Value = g }; 

這應該給你{鍵,值},其中重點將是 「A」, 「B」 的列表, 「C」,等等,和值將是一個原來自ParentDict的KeyValuePair實例。

你可以找到這個MSDN頁面上更多LINQ查詢示例:101 Linq Samples

1

之所以要做到這一點,我懷疑是因爲你需要能夠查找所有項特定鍵字母。在這種情況下,一個Lookup是更好的匹配,一般爲:

var letterLookup = ParentDict.ToLookup(kv=>kv.Key[0]); 

可用這樣的:

//letterLookup['A'] is an IEnumerable<KeyValuePair<string,string>>... 

Console.WriteLine(string.Join(", ", 
     letterLookup['A'].Select(kv=>kv.ToString()).ToArray() 
    )); // [A_1, 1], [A_2, 2] 

Console.WriteLine(new XElement("root", 
     letterLookup['B'].Select(kv=>new XElement(kv.Key,kv.Value)) 
    ));// <root><B_1>3</B_1><B_2>4</B_2></root> 


Console.WriteLine(letterLookup['B'].Any()); //true 
Console.WriteLine(letterLookup['Z'].Any()); //false 

查找在字典的優點是,它可以包含任何鍵多個值(與字典不同),並且如果某個鍵不存在,則它具有一致的API:然後返回空的枚舉,而包含枚舉的字典可能會拋出KeyNotFoundException,或者返回null,或者返回空的枚舉,全部取決於你是如何創建它的。

+0

@ Eamon Nerbonne:哦對不起...那不是原因(我知道'lookup')。其實我的要求就是這樣............. – 2010-10-23 14:22:56

+0

最後,我會將數據(以第二個字典的格式)轉儲到一個xml文件.....(這個xml文件是具有第二個詞典的結構) – 2010-10-23 14:29:12

+0

查找有什麼問題? – 2010-10-23 14:30:36

相關問題