调和对象的两个集合 [英] Reconciling two collections of objects
问题描述
我有一个表格,用户可以修改使用一个DataGrid对象的集合。当打开表单创建原始集合的深层副本,如果按下取消按钮我只是丢弃该副本。
的问题是,当确定按钮按我不得不调和的变化可能是:
- 现有对象的修改的属性
- 新的对象添加到集合中的任何地方。
- 现有对象中删除。
- 现有对象重新排序。
因为我需要保留原来的引用我不能只清除收集并添加修改的项目。
你知道一个简单的算法,将同步两个集合这样?
我使用C#3.5所以LINQ是可用的。
我刚刚制定了以下算法的一个项目我的工作,我认为它与你的要求。它遵循这样的步骤:
- 创建原始列表的浅表副本
- 清除原名单。
- 在Foreach源修改列表项。
<醇>
- 如果它发现原始对象将其添加到列表中,并更新它的属性。
- 如果不仅它添加到列表中。
这方法保持新秩序并重新使用原来的引用,但要求你的对象具有一个唯一的标识符。我使用一个GUID为
VAR originalPersons = m_originalList.ToList();
m_originalList.Clear();
的foreach(在m_modifiedList VAR modifiedPerson)
{
VAR originalPerson = originalPersons.FirstOrDefault(C => c.ID == modifiedPerson.ID);
如果(originalPerson == NULL)
m_originalList.Add(modifiedPerson);
,否则
{
m_originalList.Add(originalPerson);
originalPerson.Document = modifiedPerson.Document;
originalPerson.Name = modifiedPerson.Name;
:
}
}
祝你好运。
I have a form where users can modify a collection of objects using a DataGrid. When the form is opened I create a deep copy of the original collection and if the Cancel button is pressed I just discard that copy.
The problem is that when the OK button is pressed I have to reconcile the changes which might be:
- Modified properties of existing objects
- New objects added to any place in the collection.
- Existing objects removed.
- Existing objects re-ordered.
Since I need to keep the original references I can't just clear the collection and add the modified items.
Do you know a simple algorithm that would synchronize two collections like this?
I'm using C# 3.5 so LINQ is available.
I just worked out the following algorithm for a project I'm working on and I think it complies with your requirements. It follows this steps:
- Creates a shallow copy of the original list.
- Clears the original list.
- Foreach item in the modified list.
- If it finds the original object adds it to the list and updates it's properties.
- If not just add it to the list.
This method maintains the new order and reuses the original references but requires that your objects have an unique identifier. I'm using a Guid for that.
var originalPersons = m_originalList.ToList();
m_originalList.Clear();
foreach (var modifiedPerson in m_modifiedList)
{
var originalPerson = originalPersons.FirstOrDefault(c => c.ID == modifiedPerson.ID);
if (originalPerson == null)
m_originalList.Add(modifiedPerson);
else
{
m_originalList.Add(originalPerson);
originalPerson.Document = modifiedPerson.Document;
originalPerson.Name = modifiedPerson.Name;
...
}
}
Good luck.
这篇关于调和对象的两个集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!