0

これは非常に概念的な質問です。でも我慢してください。
2List<myType>つのツリービューから、メモリ内に 2 つの階層を含むデータがあります。1 つのオリジナルと 1 つの更新。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
                        }
                    } 
                } 
            } 
        }
    );
4

1 に答える 1

0

同じ人への複数の参照がないと仮定すると、次のアルゴリズムを使用できます。

クラスがIEquatableインターフェイスPersonを実装する必要があり、2 つのオブジェクトが同じ人を識別した場合に戻ります: 同じPK を持っている (両方のツリーに入力している場合)または ただし、比較では子を無視する必要があります (メンバーを比較してはなりません)。trueReferenceNameAgePeople

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)
    }
}
于 2013-09-12T22:09:00.087 に答える