Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查两个列表以进行修改_C#_C# 4.0_Ienumerable - Fatal编程技术网

C# 检查两个列表以进行修改

C# 检查两个列表以进行修改,c#,c#-4.0,ienumerable,C#,C# 4.0,Ienumerable,我有两个两种不同类型的列表,它们具有以下共同属性 Id-->用于标识相应的对象 一组其他属性 修改日期 需要根据修改日期比较这两个列表。如果修改日期不同(第一个列表ModificationDate大于第二个列表的ModificationDate),则将所有属性从第一个列表复制到第二个列表 请让我知道最好的方法 编辑:第二个列表可能包含也可能不包含第一个列表的所有元素,反之亦然。我的第一个列表始终是源列表。因此,如果列表1中存在一个项目,而列表2中不存在该项目,我们需要将其添加到列表2中。此外,如

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

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

一组其他属性

修改日期

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

请让我知道最好的方法


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

这可能会有所帮助。Linq库有很多像样的函数,比如除,交

查找添加/删除的项目 这将允许您执行以下操作:

// This does not assume so much for MyType
var comparer = new MyTypeIdComparer();
var added = list1.Except(list2, comparer);
var deleted = list2.Except(list1, comparer);
查找修改的项目
提供的链接有助于比较两个不同类型的列表


根据您的编辑,听起来List2只需要看起来像List1?为什么不删除List2,并制作List1的另一个副本来替换它呢?我是通过Nhibernate来完成的。因此,删除所有内容并不是一个解决方案,因为我们对其他一些表也进行了级联删除。在第一个示例中,我是否愚蠢地认为您总是会以对于您修改过的版本,list1?+1是一个完全相同的副本。@Jon.这两个列表将不是相同的类型。我已经修改了这个问题。这也行得通。
list1.Concat(list2)
@AshleyJohn:在这种情况下,您必须让它们实现相同的接口,并将该接口用作“相同”接口打字,否则会很痛苦。
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
}