【问题标题】:Group Dictionary by splitting the Key and create new Dictionary通过拆分键对字典进行分组并创建新字典
【发布时间】:2015-02-03 22:55:41
【问题描述】:

我有一个这样的字典:

Dictionary<string, object> properties = new Dictionary<string, object>()
{
    {"aa:bb", MyObject1},
    {"aa:cc", MyObject2},
    {"dd:xx", MyObject3},
    {"dd:yy", MyObject4}
};

字典的键是一个以':'为分隔符的字符串。现在我想从那个字典创建一个新的:

Dictionary<string, object> ddProperties = new Dictionary<string, object>()
{
{"xx", MyObject3},
{"yy", MyObject4}
};

我正在寻找一种通过拆分原始字典的键来创建新字典的优雅方法。 LINQ可以做到吗?

【问题讨论】:

    标签: c# string linq dictionary split


    【解决方案1】:

    试试:

    var ddProperties = properties.ToDictionary
                        (kvp => kvp.Key.Split(':')[1], kvp => kvp.Value);
    

    如果您只需要以dd 开头的那些(如您的示例输出所示),我会这样做:

    var filteredPairs = from kvp in properties
                        let split = kvp.Key.Split(':')
                        where split[0] == "dd"
                        select new { Key = split[1], kvp.Value };
    
    var ddProperties = filteredPairs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    

    请注意,这里没有防止重复的保护。如果您希望转换后出现重复键,您希望如何处理它们?

    【讨论】:

    • 看起来他只想要元素的子集,其中键的前半部分是特定标识符(在他的示例中为"dd"),因此您还需要一个 Where 子句.
    【解决方案2】:

    请注意,由于每个条目都是多个结果,请使用.SelectMany()

    如前所述,ToDictionary 可以很好地构建字典

    properties
        .SelectMany(kvp => kvp.Key.Split(':')
             // Select each item in the split
             //  to gain access to the original Key Value Pair parameter
            .Select(key => new { Key = key, Value = kvp.Value }))
        .ToDictionary(
            a => a.Key,
            a => a.Value);
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多