我有两个两种不同类型的列表,它们具有以下常见属性。
Id
- >用于识别相应的对象
Bunch of other Properties
ModificationDate
需要根据修改日期比较这两个列表。如果修改日期不同(第一个列表ModificationDate
大于第二个列表的ModificationDate
,则将所有属性(如果该项从第一个列表复制到第二
请让我知道最好的方法。
已编辑:第二个列表可能包含也可能不包含第一个列表中的所有元素,反之亦然。我的第一个列表始终是源列表。因此,如果一个项目存在于列表1中而不存在于列表2中,我们需要将其添加到列表2中。如果列表2中存在但不在列表1中的项目,则将其从列表2中删除。
答案 0 :(得分:5)
var list1 = new List<MyType>();
var list2 = new List<MyType>();
// These two assume MyType : IEquatable<MyType>
var added = list1.Except(list2);
var deleted = list2.Except(list1);
// Now add "added" to list2, remove "deleted" from list2
如果MyType
未实现IEquatable<MyType>
,或者实施不仅仅基于比较ID,则需要创建IEqualityComparer<MyType>
:
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
}
答案 1 :(得分:1)
这可能会有所帮助。 Linq库有许多不错的功能,例如Except,Intersection。
答案 2 :(得分:0)
提供的链接有助于比较两个不同类型的列表