2012-05-09 127 views
4

我有一個Dictionary<string,string>,我想分組。下面是一些示例鍵/值對GroupBy基於密鑰字典

========================== 
| Key   | Value | 
========================== 
| A_FirstValue | 1  | 
| A_SecondValue | 2  | 
| B_FirstValue | 1  | 
| B_SecondValue | 2  | 
========================== 

現在,我想組根據第一個字母或單詞中的關鍵角色的第一個實例之前'_'

所以,最終的結果將是是Dictionary<string, Dictionary<string, string>>。對於結果上面的例子將是:

A -> A_FirstValue, 1 
    A_SecondValue, 2 

B -> B_FirstValue, 1 
    B_SecondValue, 2 

這甚至可能嗎?任何人都可以幫助我嗎?

謝謝。

回答

0
yourDictionary 
    .GroupBy(g => g.Key.Substring(0, 1)) 
    .ToDictionary(k => k.Key, v => v.ToDictionary(k1 => k1.Key, v1 => v1.Value)); 
+1

請注意,這實際上返回一個'Dictionary >>'。 –

+0

謝謝,我錯過了。 –

9

嗯,你可以使用:

var dictionary = dictionary.GroupBy(pair => pair.Key.Substring(0, 1)) 
     .ToDictionary(group => group.Key, 
        group => group.ToDictionary(pair => pair.Key, 
               pair => pair.Value)); 

在組部分會給你一個IGrouping<string, KeyValuePair<string, string>>,並隨後將ToDictionary各組鍵/值對轉換回一本字典。

編輯:請注意,這將始終使用第一個字母。對於任何更復雜的事情,我可能會編寫一個單獨的ExtractFirstWord(string)方法,並在GroupBy lambda表達式中調用該方法。

+2

OP表示他希望「根據字符'_'」的第一個字母之前的第一個字母或詞組對其進行分組,即使他的示例不支持:它總是一個字母。我認爲'Key.Substring(0,p.Key.IndexOf('_')'將是更好的選擇。 – dasblinkenlight

+1

不應該是'dictionary.GroupBy(g => g.Key.Substring(0,1) )' – Umair

+0

@Umair:對,編輯相應的。 –

0

這是我想出來的。應該有一些錯誤處理來確保密鑰中存在_,但應該讓你開始。

 var source = new Dictionary<string, int>(); 

     source.Add("A_FirstValue", 1); 
     source.Add("A_SecondValue", 2); 
     source.Add("B_FirstValue", 1); 
     source.Add("B_SecondValue", 3); 

     var dest = new Dictionary<string, Dictionary<string, int>>(); 

     foreach (KeyValuePair<string, int> entry in source) { 
      string prefix = entry.Key.Split('_')[0]; 
      if (!dest.ContainsKey(prefix)) { 
       dest.Add(prefix, new Dictionary<string, int>()); 
      } 

      dest[prefix].Add(entry.Key, entry.Value); 

     }