2

我有一个看起来像这样的字符串列表:

abc|key1|486997
def|key1|488979
ghi|key2|998788 
gkl|key2|998778
olz|key1|045669

如何使用 LINQ 和 ToDictionary 生成一个Dictionary<string, List<string>>看起来像

key1 : { abc|key1|486997, def|key1|488979, olz|key1|045669 }
key2 : { ghi|key2|998788, gkl|key2|998778 }

基本上,我希望能够提取第二个元素作为键,使用 ToDictionary() 在一轮中创建字典。

我目前正在这样做..

 var d = new Dictionary<string, List<string>>();

            foreach(var l in values)
            {
                var b = l.Split('|');
                var k = b.ElementAtOrDefault(1);

                if (!d.ContainsKey(k))
                    d.Add(k, new List<string>());

                d[k].Add(l);
            }

我已经看到有关从单个分隔值字符串构建字典的问题,但我想知道是否有一种优雅的方法可以从分隔字符串列表开始。

4

3 回答 3

4
var list = new []
{
"abc|key1|486997",
"def|key1|488979",
"ghi|key2|998788",
"gkl|key2|998778",
"olz|key1|045669"
};

var dict = list.GroupBy(x => x.Split('|')[1])
               .ToDictionary(x => x.Key, x => x.ToList());

您还可以一次将其转换为查找(与 a 非常相似Dictionary<K,IEnumerable<V>>):

var lookup = list.ToLookup(x => x.Split('|')[1]);
于 2012-05-03T18:03:23.310 回答
1

如果保证您的数据是这样一致的,您可以执行以下操作:

var data = new[]
                {
                    "abc|key1|486997",
                    "def|key1|488979",
                    "ghi|key2|998788",
                    "gkl|key2|998778",
                    "olz|key1|045669"
                };
var items = data
            .GroupBy(k => k.Split('|')[1])
            .ToDictionary(k => k.Key, v => v.ToList());
于 2012-05-03T17:56:54.653 回答
1
var data = new[]
                {
                    "abc|key1|486997",
                    "def|key1|488979",
                    "ghi|key2|998788",
                    "gkl|key2|998778",
                    "olz|key1|045669"
                };
var dictionary = data.Select(row => row.Split('|'))
  .GroupBy(row =>  row[1])
  .ToDictionary(group => group.Key, group => group);
于 2012-05-03T18:02:01.437 回答