我的第一个数据收集是这样的:
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/