gpt4 book ai didi

c# - 检查两个列表的修改

转载 作者:行者123 更新时间:2023-11-30 14:38:44 25 4
gpt4 key购买 nike

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

Id -->用于标识对应的对象

一堆其他属性

修改日期

需要根据修改日期比较这两个列表。如果修改日期不同(第一个列表 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

如果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
}

关于c# - 检查两个列表的修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7434855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com