比较两个同步对象列表 [英] Compare Two List Of Objects For Synchronization

查看:410
本文介绍了比较两个同步对象列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个课程,

Class A
{
    ID;
    Name;
    LastModifiedDate;
}

我有两个List,ListA1和ListA2,

and I have Two List's, ListA1 and ListA2,

ListA1 = new List<A>(); 
ListA2 = new List<A>();

ListA1.Add(new A{ ID=1, Name="A", LastModifiedDate='1/1/2000' })
ListA1.Add(new A{ ID=2, Name="B", LastModifiedDate='1/2/2000' })
ListA1.Add(new A{ ID=3,Name="C", LastModifiedDate='1/2/2000' })
...................................................


ListA2.Add(new A{ ID=4, Name="D", LastModifiedDate='1/4/2000' })
ListA2.Add(new A{ ID=1, Name="A", LastModifiedDate='1/5/2000' })
ListA3.Add(new A{ ID=2, Name="B", LastModifiedDate='1/2/2000' })



现在,我需要比较ListA1和ListA2,比较LastModifiedDate中。我需要两个新的List,描述ListA1中的新的/更新的项目,并描述ListA2中的新的/更新的项目。

Now, I need to compare ListA1 and ListA2 by comparing LastModifiedDate. I need two new List's, describing what are new/updated items in ListA1 and describing what are new/updated items in ListA2.

更新:我想看的输出是,

newUpadtedListA ={
    new A{ ID=4, Name="D", LastModifiedDate='1/4/2000' },
    new A{ ID=1, Name="A", LastModifiedDate='1/5/2000' }
}

newUpadtedListB ={
    new A{ ID=3, Name="C", LastModifiedDate='1/2/2000' }
}


推荐答案

您可以使用Linq和 Enumerable.Except

You can use Linq and Enumerable.Except:

var a1Modified = ListA1.Select(x => x.LastModifiedDate);
var a2Modified = ListA2.Select(x => x.LastModifiedDate);
var a1NotInA2LastModified = a1Modified.Except(a2Modified);
List<A> newInA1 = (from a1 in ListA1
              join notInA2 in a1NotInA2LastModified
              on a1.LastModifiedDate equals notInA2
              select a1).ToList();

相反, List2中的新功能

var a2NotInA1LastModified = a2Modified.Except(a1Modified);
List<A> newInA2 = (from a2 in ListA2
              join notInA1 in a2NotInA1LastModified
              on a2.LastModifiedDate equals notInA1
              select a2).ToList();

编辑:根据您最后一次编辑 ID 是唯一的键列。这应该以相当有效的方式给你所有你需要的:

Edit: according to your last edit that ID is the only key column. This should give you all you need in a fairly efficient way:

var a1IDs = ListA1.Select(a => a.ID);
var a2IDs = ListA2.Select(a => a.ID);
var newInA1 = from l1 in ListA1
              join newA1 in a1IDs.Except(a2IDs)
              on l1.ID equals newA1
              select l1;
var newInA2 = from l2 in ListA2
              join newA2 in a2IDs.Except(a1IDs)
              on l2.ID equals newA2
              select l2;
var updatedInA1 = from l1 in ListA1
                  join l2 in ListA2
                  on l1.ID equals l2.ID
                  where l1.LastModifiedDate > l2.LastModifiedDate
                  select l1;
var updatedInA2 = from l2 in ListA2
                  join l1 in ListA1
                  on l2.ID equals l1.ID
                  where l2.LastModifiedDate > l1.LastModifiedDate
                  select l2;

您可以枚举这些序列,并执行任何您需要做的操作来添加或更新新的/ 。

You can enumerate these sequences and do whatever you need to do to add or update the new/changed items.

这篇关于比较两个同步对象列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆