C# 检查两个列表以进行修改
我有两个两种不同类型的列表,它们具有以下共同属性C# 检查两个列表以进行修改,c#,c#-4.0,ienumerable,C#,C# 4.0,Ienumerable,我有两个两种不同类型的列表,它们具有以下共同属性 Id-->用于标识相应的对象 一组其他属性 修改日期 需要根据修改日期比较这两个列表。如果修改日期不同(第一个列表ModificationDate大于第二个列表的ModificationDate),则将所有属性从第一个列表复制到第二个列表 请让我知道最好的方法 编辑:第二个列表可能包含也可能不包含第一个列表的所有元素,反之亦然。我的第一个列表始终是源列表。因此,如果列表1中存在一个项目,而列表2中不存在该项目,我们需要将其添加到列表2中。此外,如
Id
-->用于标识相应的对象
一组其他属性
修改日期
需要根据修改日期比较这两个列表。如果修改日期不同(第一个列表ModificationDate
大于第二个列表的ModificationDate
),则将所有属性从第一个列表复制到第二个列表
请让我知道最好的方法
编辑:第二个列表可能包含也可能不包含第一个列表的所有元素,反之亦然。我的第一个列表始终是源列表。因此,如果列表1中存在一个项目,而列表2中不存在该项目,我们需要将其添加到列表2中。此外,如果列表2中存在但列表1中不存在的项目,则将其从列表2中删除。这可能会有所帮助。Linq库有很多像样的函数,比如除,交 查找添加/删除的项目 这将允许您执行以下操作:
// This does not assume so much for MyType
var comparer = new MyTypeIdComparer();
var added = list1.Except(list2, comparer);
var deleted = list2.Except(list1, comparer);
查找修改的项目
提供的链接有助于比较两个不同类型的列表
根据您的编辑,听起来List2只需要看起来像List1?为什么不删除List2,并制作List1的另一个副本来替换它呢?我是通过Nhibernate来完成的。因此,删除所有内容并不是一个解决方案,因为我们对其他一些表也进行了级联删除。在第一个示例中,我是否愚蠢地认为您总是会以对于您修改过的版本,list1?+1是一个完全相同的副本。@Jon.这两个列表将不是相同的类型。我已经修改了这个问题。这也行得通。
list1.Concat(list2)
@AshleyJohn:在这种情况下,您必须让它们实现相同的接口,并将该接口用作“相同”接口打字,否则会很痛苦。
class MyTypeIdComparer : IEqualityComparer<MyType>
{
public bool Equals(MyType x, MyType y)
{
return x.Id.CompareTo(y.Id);
}
public int GetHashCode(MyType obj)
{
return obj.Id.GetHashCode();
}
}
// This does not assume so much for MyType
var comparer = new MyTypeIdComparer();
var added = list1.Except(list2, comparer);
var deleted = list2.Except(list1, comparer);
var modified = list1.Concat(list2)
.GroupBy(item => item.Id)
.Where(g => g.Select(item => item.ModificationDate)
.Distinct().Count() != 1);
// To propagate the modifications:
foreach(var grp in modified) {
var items = grp.OrderBy(item => item.ModificationDate);
var target = items.First(); // earliest modification date = old
var source = grp.Last(); // latest modification date = new
// And now copy properties from source to target
}