仅在两个分层列表之间保存更改

本文关键字:分层 列表 之间 保存更改 两个 | 更新日期: 2023-09-27 18:30:55

这是一个非常概念化的问题,我可能会为此得到-ves。但请耐心等待。
我有 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
                        }
                    } 
                } 
            } 
        }
    );

仅在两个分层列表之间保存更改

假设您没有对同一个人的多个引用,则可以使用以下算法。

它需要Person类来实现IEquatable接口,如果2个对象标识同一个人,则返回true:具有相同的Reference PK(如果你在两个树中都填充了它)或NameAge;但比较应该忽略子项(不应该比较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)
    }
}