通过拆分键组合词典并创建新词典

时间:2015-02-03 22:55:42

标签: c# string linq dictionary split

我有这样的词典:

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有关吗?

2 个答案:

答案 0 :(得分:3)

尝试:

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

请注意,此处不存在重复保护。如果您在转换后期望重复键,您希望如何处理它们?

答案 1 :(得分:1)

请注意,由于每个条目都是多个结果,因此请使用.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);