2012-05-09 130 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); 

     }