Ash*_*ohn 3 c# ienumerable c#-4.0
我有两个不同类型的列表,它们具有以下常见属性.
Id - >用于识别相应的对象
Bunch of other Properties
ModificationDate
需要根据修改日期比较这两个列表.如果修改日期不同(第一个列表ModificationDate大于第二个列表的ModificationDate那个,则将所有属性复制,如果该项目从第一个列表到第二个列表.
请让我知道最好的方法.
编辑:第二个列表可能包含或不包含第一个列表的所有元素,反之亦然.我的第一个列表始终是源列表.因此,如果一个项目存在于列表1中而不存在于列表2中,我们需要将其添加到列表2中.如果列表2中存在但是不在列表1中的项目则将其从列表2中删除.
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)
| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |