したがって、ツリー ビューがあり、その一部の行は DataTable から取得されます。データ テーブルをフェッチするときに、次の基本的なルールでツリーを更新したいと考えています。
- ツリーに存在するが DataTable に対応する行がないノードを削除する
- ツリーに存在するが更新が必要な更新ノード (異なる DateTime)
- ツリーには存在しないが DataTable には存在するノードを挿入します。
そのために、Guid (DataTable の主キー) をツリー ノードにハッシュする辞書があります。
Dictionary<Guid, NoteNode> MyHashNoteToNode;
ここで、NoteNode は TreeNode から派生し、LastEdit DateTime フィールドが追加されています。これまでのところ、とても平凡です。
ツリーと DataTable の違いを表す 3 つのセットを見つけるために、以下のコードを書きました。3 つのセット (挿入、編集、削除) を返す非常に単純な Linq クエリ、またはそれを実行する簡潔なクエリがあることを知りたいです。おそらく、どこかに欠けているメソッドです。それとも、これはかなり最適ですか?
// Find all items that need inserting.
List<DataRow> toInsert = new List<DataRow>();
foreach (DataRow row in MyNotes.Rows)
{
NoteNode node = null;
MyHashNoteToNode.TryGetValue((Guid)row["ID"], out node);
if(node == null)
{
toInsert.Add(row);
}
}
// Find all items that need editing/changing.
List<DataRow> toEdit = new List<DataRow>();
foreach (DataRow row in MyNotes.Rows)
{
NoteNode node = null;
MyHashNoteToNode.TryGetValue((Guid)row["ID"], out node);
if(node != null)
{
if((DateTime)row["Edited"] != node.LastEdit)
{
toEdit.Add(row);
}
}
}
// Find all items that need deleting.
List<NoteNode> toDelete = new List<NoteNode>();
foreach (NoteNode node in MyHashNoteToNode.Values)
{
if (!MyNotes.Rows.Contains(node.Key))
{
toDelete.Add(node);
}
}
}