检查两个修改列表

Ash*_*ohn 3 c# ienumerable c#-4.0

我有两个不同类型的列表,它们具有以下常见属性.

Id - >用于识别相应的对象

Bunch of other Properties

ModificationDate

需要根据修改日期比较这两个列表.如果修改日期不同(第一个列表ModificationDate大于第二个列表的ModificationDate那个,则将所有属性复制,如果该项目从第一个列表到第二个列表.

请让我知道最好的方法.

编辑:第二个列表可能包含或不包含第一个列表的所有元素,反之亦然.我的第一个列表始终是源列表.因此,如果一个项目存在于列表1中而不存在于列表2中,我们需要将其添加到列表2中.如果列表2中存在但是不在列表1中的项目则将其从列表2中删除.

Jon*_*Jon 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
Run Code Online (Sandbox Code Playgroud)

如果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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许你做:

// This does not assume so much for MyType
var comparer = new MyTypeIdComparer();
var added = list1.Except(list2, comparer);
var deleted = list2.Except(list1, comparer);
Run Code Online (Sandbox Code Playgroud)

寻找修改过的物品

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
}
Run Code Online (Sandbox Code Playgroud)