C# 查找两个数据表之间的差异
因此,我有一个树状视图,其中一些行来自一个数据表。在获取数据表时,我希望使用以下基本规则更新树:C# 查找两个数据表之间的差异,c#,linq,datatable,C#,Linq,Datatable,因此,我有一个树状视图,其中一些行来自一个数据表。在获取数据表时,我希望使用以下基本规则更新树: 删除树中存在但没有相应行的节点 在数据表中 更新树中存在但需要的节点 更新(不同的日期时间) 插入中不存在的节点 树,但不在数据表中 为此,我有一个字典,将Guid(DataTable中的主键)散列到树节点: Dictionary<Guid, NoteNode> MyHashNoteToNode; 字典MyHashNoteToNode; ,其中NoteNode派生自TreeNod
- 删除树中存在但没有相应行的节点 在数据表中
- 更新树中存在但需要的节点 更新(不同的日期时间)
- 插入中不存在的节点 树,但不在数据表中
Dictionary<Guid, NoteNode> MyHashNoteToNode;
字典MyHashNoteToNode;
,其中NoteNode派生自TreeNode,并添加了LastEdit DateTime字段。到目前为止,一切都很平淡
为了找到表示树和数据表之间差异的3个集合,我编写了下面的代码。我很想听到有一个非常简单的Linq查询,它将返回3个集合(插入、编辑、删除),或者一些简洁的东西,可以为我实现这一点,也许我在某个地方遗漏了一个方法。或者这是非常理想的
// 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);
}
}
//查找所有需要插入的项。
List toInsert=新列表();
foreach(MyNotes.Rows中的数据行)
{
NoteNode=null;
MyHashNoteToNode.TryGetValue((Guid)行[“ID”],out节点);
if(node==null)
{
toInsert.Add(行);
}
}
//查找所有需要编辑/更改的项目。
List toEdit=新列表();
foreach(MyNotes.Rows中的数据行)
{
NoteNode=null;
MyHashNoteToNode.TryGetValue((Guid)行[“ID”],out节点);
如果(节点!=null)
{
如果((日期时间)行[“已编辑”!=node.LastEdit)
{
toEdit.Add(行);
}
}
}
//查找所有需要删除的项目。
List toDelete=新列表();
foreach(MyHashNoteToNode.Values中的NoteNode节点)
{
如果(!MyNotes.Rows.Contains(node.Key))
{
添加(节点);
}
}
}从
数据表制作词典的一种简单方法是
DataSet newData;
DataSet existingData;
var before = existingData.AsEnumerable().ToDictionary(
n => Guid.Parse(n.Field<string>("ID")),
n => n);
var after = newData.AsEnumerable().ToDictionary(
n => Guid.Parse(n.Field<string>("ID")),
n => n);
要查找需要工作的行
var keysToInsert = after.Select(p => p.Key).Except(before.Select(p => p.Key));
var keysToDelete = before.Select(p => p.Key).Except(after.Select(p => p.Key));
var keysTheSame = before.Select(p => p.Key).Intersect(after.Select(p => p.Key));
var nodesToInsert = keysToInsert.Select(k => after[k]);
var nodesToDelete = keysToDelete.Select(k => before[k]);
var nodesThatNeedUpdates = keysTheSame
.Where(k =>
before[k].Field<DateTime>("Edited") !=
after[k].Field<DateTime>("Edited"))
.Select(k => after[k]);
var nodesToInsert=keystinsert.Select(k=>在[k]之后);
var nodesToDelete=keystedelete.Select(k=>before[k]);
var nodesthatheneedupdates=keysTheSame
.其中(k=>
在[k]之前。字段(“已编辑”)=
[k]之后。字段(“已编辑”))
.选择(k=>在[k]之后);
从数据表制作词典的一种简单方法是
DataSet newData;
DataSet existingData;
var before = existingData.AsEnumerable().ToDictionary(
n => Guid.Parse(n.Field<string>("ID")),
n => n);
var after = newData.AsEnumerable().ToDictionary(
n => Guid.Parse(n.Field<string>("ID")),
n => n);
要查找需要工作的行
var keysToInsert = after.Select(p => p.Key).Except(before.Select(p => p.Key));
var keysToDelete = before.Select(p => p.Key).Except(after.Select(p => p.Key));
var keysTheSame = before.Select(p => p.Key).Intersect(after.Select(p => p.Key));
var nodesToInsert = keysToInsert.Select(k => after[k]);
var nodesToDelete = keysToDelete.Select(k => before[k]);
var nodesThatNeedUpdates = keysTheSame
.Where(k =>
before[k].Field<DateTime>("Edited") !=
after[k].Field<DateTime>("Edited"))
.Select(k => after[k]);
var nodesToInsert=keystinsert.Select(k=>在[k]之后);
var nodesToDelete=keystedelete.Select(k=>before[k]);
var nodesthatheneedupdates=keysTheSame
.其中(k=>
在[k]之前。字段(“已编辑”)=
[k]之后。字段(“已编辑”))
.选择(k=>在[k]之后);