检查两个修改列表

时间:2011-09-15 17:14:25

标签: c# c#-4.0 ienumerable

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

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

Bunch of other Properties

ModificationDate

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

请让我知道最好的方法。

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

3 个答案:

答案 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。

http://msdn.microsoft.com/en-us/library/bb397894.aspx

答案 2 :(得分:0)

提供的链接有助于比较两个不同类型的列表

Comparing Collections in .Net