这是一个非常概念化的问题,我可能会为此而努力。但请耐心等待我。
我有2个List<myType>
包含来自两个树视图的内存中的数据层次结构。一个原件和一个更新。 myType
具有自连接属性,因此树结构。
目前,我正在清除整个表并将更新的列表保存到我的数据库中。
由于这不是有效的,我如何比较它们和仅保存更改到我的数据库?
以下是一个场景:
List<Person> tree1 = new List<Person>();
tree1.Add
(
new Person()
{
Name = "Sr. John",
Age = 15,
People = new List<Person>()
{
new Person()
{
Name="John",
Age=10,
People=null
}
}
}
);
List<Person> tree2 = new List<Person>();
tree2.Add
(
new Person()
{
Name = "Sr. John",
Age = 15,
People = new List<Person>()
{
new Person()
{
Name = "John",
Age = 10,
People = new List<Person>()
{
new Person()
{
Name = "Jr. John",
Age = 5,
People = null
}
}
}
}
}
);
答案 0 :(得分:0)
假设您没有多个同一个人的引用,您可以使用以下算法。
它需要Person
类来实现IEquatable接口,如果2个对象标识同一个人,则返回true
:具有相同的Reference
PK(如果已填充它)在两个树)或Name
和Age
;但是比较应该忽略孩子(不应该比较People
成员)。
private static List<Person> EmptyList = new List<Person>();
void SaveDifference(List<Person> treeold, List<Person> treenew)
{
foreach(var pers in treenew)
{
int index = treeold.IndexOf(pers);
if(index >= 0)
{ // node exists in both lists, check chlid nodes:
SaveDifference(treeold[index].People, pers.People);
treeold.RemoveAt(index);
}
else
{ // new added node
// TODO: Store 'pers' to database (and update references in parent)
SaveDifferences(EmptyList, pers.People)
}
}
foreach(var pers in treeold)
{ // node was deleted
SaveDifferences(pers.People, EmptyList);
// TODO: remove 'pers' from DB (and update references in parent)
}
}