【发布时间】:2019-10-07 14:08:55
【问题描述】:
我正在努力寻找一个简单的解决方案来解决我的问题: 我有两个对象列表,想根据一个属性(串行)比较它们,并创建一个包含两个列表中的对象的新列表。如果对象仅在列表一中,我想将其标记为已删除(状态),如果它仅在列表二中,则应将其标记为新(状态)。如果它在两者中我想将其标记为已更改(状态)并存储旧值和新值(金额/新金额)。
所以它看起来像这样:
名单一:
[
{
serial: 63245-8,
amount: 10
},
{
serial: 08657-5,
amount: 100
}
,
{
serial: 29995-0,
amount: 500
}
]
清单二:
[
{
serial: 63245-8,
amount: 100
},
{
serial: 67455-1,
amount: 100
}
,
{
serial: 44187-10,
amount: 50
}
]
输出:
[
{
serial: 63245-8,
amount: 10,
newAmount: 100
status: "changed"
},
{
serial: 08657-5,
amount: 100
status: "deleted"
},
{
serial: 29995-0,
amount: 500,
status: "deleted"
}
{
serial: 67455-1,
amount: 100
status: "new"
}
,
{
serial: 44187-10,
amount: 50
status: "new"
}
]
除了遍历两个列表并与另一个列表进行比较,构建三个不同的列表并将它们合并到最后,甚至最终对它们进行排序之外,我想不出任何好的解决方案。 我很确定有更好的解决方案,甚至可能使用 AutoMapper ? 谁能帮帮我?
谢谢!
编辑:因为问题出现在评论中。 如果项目在两个列表中,则状态可以是“已更改”或“未更改”。这对实现并不重要,因为我显示对象的新旧数量,只需要特别标记已删除和新对象。不过,状态“未更改”将是一个不错的选择,以供将来参考。
【问题讨论】:
-
您是否至少为您的列表将保存的数据类型创建了任何类?
-
看看IEnumerable.Except 和IEnumerable.Intersect。应该能够结合上述方法想出一个解决方案。
-
@Innat3 是的,我已经有存储在数据库中的实体,我围绕它构建了一个用于查询该数据的 webAPI。我只是不想在这里使问题复杂化并粘贴不必要的代码
-
@dymanoid 因为我的列表来自存储在我的数据库中的实体
-
但是您的列表是 JSON,而不是 DTO。您应该选择考虑“这个问题是什么”而不是“这个问题包含什么”的标签。