【问题标题】:Using LINQ to build a Dictionary from a List of delimited strings使用 LINQ 从分隔字符串列表构建字典
【发布时间】:2012-05-03 17:52:45
【问题描述】:

我有一个如下所示的字符串列表:

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);
            }

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

【问题讨论】:

标签: c# linq dictionary


【解决方案1】:
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());

您还可以一次性将其转换为查找(与Dictionary&lt;K,IEnumerable&lt;V&gt;&gt; 非常相似):

var lookup = list.ToLookup(x => x.Split('|')[1]);

【讨论】:

  • 谢谢!这就是我最终弄清楚的。
【解决方案2】:
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);

【讨论】:

  • 这将返回一个Dictionary&lt;string, IGrouping&lt;string, string[]&gt;&gt;
  • @vcsjones 是的,是的。 OP 没有指定所需的类型,所以我们不知道他会如何使用它。
  • 引用 OP:如何使用 LINQ 和 ToDictionary 生成 Dictionary>
【解决方案3】:

如果保证你的数据是这样一致的,你可以这样做:

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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2016-03-23
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多