我的第一个数据收集是这样的:

IEnumerable<Dictionary<string, object>> firstSourceData;


项目是这样的:

new Dictionary<string, object>
{
    ["id"] = 1,
    ["name"] = "some",
    ["age"] = 30
}


我的第二个数据是另一个字典集合:

IEnumerable<Dictionary<string, object>> secondSourceData;


项目是这样的:

new Dictionary<string, object>
{
    ["id"] = 1,
    ["sales"] = 58,
    ["age"] = 30
}


这两个数据来自不同的来源,我将创建一个不包含重复值的字典集合。仅Id密钥是词典的标准功能,其他属性可能会更改。

IEnumerable<Dictionary<string, object>> joined;

new Dictionary<string, object>
{
    ["id"] = 1,
    ["sales"] = 58,
    ["name"] = "some",
    ["age"] = 30
},


如何使用LINQ lambda表达式执行此操作? (如果源长度不同,会有任何问题)

最佳答案

这是您要执行的操作:


合并两个词典集合。
按“ id”键值对项目进行分组。
对于每个组,您都有多个词典,因此请使用SelectMany展平,然后在键上使用GroupBy。现在,您可以重新创建字典-ToDictionary。注意,您可能会有重复出现的键,因此这就是嵌套GroupBy并为值选择所需键的原因。在这里我只是使用FirstOrDefault


所以:

var result = firstSourceData.Concat(secondSourceData)
                .GroupBy(item => item["id"])
                .Select(group => group.SelectMany(item => item)
                                      .GroupBy(item => item.Key)
                                      .ToDictionary(key => key.Key,
                                                    value => value.FirstOrDefault().Value));




结果如下:

new Dictionary<string, object>
{
    ["id"] = 1,
    ["sales"] = 58,
    ["name"] = "some",
    ["age"] = 30
},
new Dictionary<string, object>
{
    ["id"] = 2,
    ["sales"] = 58,
    ["age"] = 30
}


对于此测试用例:

var firstSourceData = new List<Dictionary<string, object>>
{
    new Dictionary<string, object>
    {
        ["id"] = 1,
        ["sales"] = 58,
        ["age"] = 30
    },
    new Dictionary<string, object>
    {
        ["id"] = 2,
        ["sales"] = 58,
        ["age"] = 30
    }
};

var secondSourceData = new List<Dictionary<string, object>>
{
    new Dictionary<string, object>
    {
        ["id"] = 1,
        ["name"] = "some",
        ["age"] = 30
    }
};

关于c# - 如何加入两个字典集合linq查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45689008/

10-11 02:07