【发布时间】:2018-10-10 13:45:45
【问题描述】:
给定两个具有递归结构的对象集合:
Collection1 = [
{
Header: "H1",
Items: [{
Header: "H1.1"
},{
Header: "H1.2"
}]
},
{
Header: "H2",
Items: [{
Header: "H2.1"
}]
}
]
Collection2 = [
{
Header: "H1",
Items: [{
Header: "H1.1",
Items: [{
Header: "H1.1.1"
}]
}]
}
]
我想创建某种函数来组合这两个集合,该集合具有我指出的比较属性,在本例中为Header,并且结合了它们的属性,因此结果有点如下:
Result = [
{
Header: "H1",
Items: [{
Header: "H1.1",
Items: [{
Header: "H1.1.1"
}]
},{
Header: "H1.2"
}]
},
{
Header: "H2",
Items: [{
Header: "H2.1"
}]
}
]
如您所见,它递归地检查对象属性,如果存在类似的项目(在本例中,比较 Header 属性),它只会合并两个对象。
我尝试过Union()、Distinct() 等等,但我似乎找不到实现这一目标的方法。
编辑:合并应该在“相同级别”的基础上完成,因此只有在相同深度级别具有相同标题的项目才应该被视为相等。
【问题讨论】:
-
只有当整个树相等时才应该合并?那么,如果您的 Collection2 有
H1.foo而不是H1.1它不会合并? -
是的,它会合并,但是因为 Collection2 会有一个带有不同标题的项目,所以它将被视为集合内的不同项目(因此它们将共存:它将有一个
H1.foo的项目和H1.1的项目)。 -
顺序重要吗?假设第二个集合在 H1 之前开始“H2/H2.1”。现在这两个集合应该如何合并?
-
你的数据结构是递归的,所以你的合并算法也应该是递归的。这意味着您需要一个基本案例。你能列举出基本情况吗?也就是说,您可以不执行任何递归步骤即可解决问题的简单案例有哪些?
-
@EricLippert 假设我们将两个集合都传递给函数,第一个参数集合应该是排序时要考虑的参数。
标签: c# recursion collections merge