gpt4 book ai didi

c# - 按 ID 匹配的 Zip 集合

转载 作者:行者123 更新时间:2023-11-30 15:52:43 24 4
gpt4 key购买 nike

这是对先前被错误地作为重复问题关闭的问题的重新发布:

假设我有两个相同类型的集合,如下所示:

OldCollection: [{ID: 1, 其他 Prop }, {ID: 2, 其他 Prop }, {ID: 3,其他 Prop }]

NewCollection: [{ID: 1, 其他 Prop }, {ID: 3, 其他 Prop }, {ID: 4,其他 Prop }]

有没有办法压缩匹配 ID 的集合以获得如下所示的元组结果:

[{OLD-ID1, NEW-ID1},
{OLD-ID2, null},
{OLD-ID3, NEW-ID3},
{null, NEW-ID4}]

所以基本上我想将集合压缩在一起,匹配 ID,如果只有一个集合有一个具有特定 ID 的条目,则元组应该为该位置填充 null。

重要提示:这不是完整外部联接解决方案的副本。我不想合并我的结果,以便 Col1-ID1 与 Col2-ID1 合并。我只想对它们进行元组处理,这样我就可以并排看到它们。将其视为 Collection 1 是旧值,Collection 2 是新值。我希望将它们配对到元组中,以便我可以看到更新了 ID1 和 ID3,删除了 ID2,并添加了 ID4。

这是一个DotNetFiddle example这几乎就是我想要的。该 fiddle 的结果是:

 [
{
"Item1": {
"id": 1,
"name": "firstOld"
},
"Item2": {
"id": 1,
"name": "firstNew"
}
},
{
"Item1": {
"id": 2,
"name": "secondOld"
},
"Item2": {
"id": 3,
"name": "thirdNew"
}
},
{
"Item1": {
"id": 3,
"name": "thirdOld"
},
"Item2": {
"id": 4,
"name": "fourthNew"
}
},
{
"Item1": null,
"Item2": {
"id": 5,
"name": "fifthNew"
}
}
]

我想要的是:

[
{
"Item1": {
"id": 1,
"name": "firstOld"
},
"Item2": {
"id": 1,
"name": "firstNew"
}
},
{
"Item1": {
"id": 2,
"name": "secondOld"
},
"Item2": null
},
{
"Item1": {
"id": 3,
"name": "thirdOld"
},
"Item2": {
"id": 3,
"name": "thirdNew"
}
},
{
"Item1": null,
"Item2": {
"id": 4,
"name": "fourthNew"
}
},
{
"Item1": null,
"Item2": {
"id": 5,
"name": "fifthNew"
}
}
]

最佳答案

无论如何你都想要一个全外连接,但你可以使用这个简单的方法:

var oldByID = oldCollection.ToDictionary(x => x.Id);
var newByID = newCollection.ToDictionary(x => x.Id);
IEnumerable<int> allIds = oldByID.Keys.Union(newByID.Keys);

var oldAndNew = allIds.Select(id =>
(Old: oldByID.TryGetValue(id, out var oldObj) ? oldObj : null,
New: newByID.TryGetValue(id, out var newObj) ? newObj : null));

所以首先创建两个字典,通过Id高效地查找新旧对象。然后收集所有 ID 并使用 Select 获取每个 ID 的旧/新对象。如果它在字典中不可用,它会将 null 分配给元组项。

关于c# - 按 ID 匹配的 Zip 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53728412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com