0

假设我有一堂课,

Class A
{
    ID;
    Name;
    LastModifiedDate;
}

我有两个列表,ListA1 和 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' })

现在,我需要通过比较 LastModifiedDate 来比较 ListA1 和 ListA2。我需要两个新的列表,描述 ListA1 中的新/更新项目和 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' }
}
4

2 回答 2

1

您可以使用 Linq 和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是唯一的关键列。这应该以一种相当有效的方式为您提供所需的一切:

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;

您可以枚举这些序列并执行您需要做的任何事情来添加或更新新的/更改的项目。

于 2012-09-24T08:45:23.667 回答
1
  var ListA1 = new AList();
  var ListA2 = new AList();

  ListA1.Add(new A { ID = 1, Name = "A", LastModifiedDate = new DateTime(2012, 01, 01) });
  ListA1.Add(new A { ID = 2, Name = "B", LastModifiedDate = new DateTime(2012, 01, 01) });
  ListA1.Add(new A { ID = 3, Name = "C", LastModifiedDate = new DateTime(2012, 01, 01) });

  ListA2.Add(new A { ID = 4, Name = "D", LastModifiedDate = new DateTime(2012, 01, 02) });
  ListA2.Add(new A { ID = 1, Name = "A", LastModifiedDate = new DateTime(2012, 01, 02) });
  ListA2.Add(new A { ID = 2, Name = "B", LastModifiedDate = new DateTime(2012, 01, 02) });

  ListA1.CompareList(ListA2);

现在我将 ListA1 与 ListA2 进行比较,当发生这种情况时,理论上您应该希望将 ListA2 中的 ID 4 添加到 ListA1 中,然后更新 ID 1 和 2,因此输出应该是

ID 1 - 2012/01/02
ID 2 - 2012/01/02
ID 3 - 2012/01/01
ID 4 - 2012/01/02

请将此代码用于输出

  public class AList : List<A>
  {
    public void CompareList(List<A> SecondaryList)
    {
      var compareResults = (from a in SecondaryList
                           join b in this on a.ID equals b.ID into gj
                           from subset in gj.DefaultIfEmpty()
                           select new { IsNew = (subset == null),
                                        IsUpdate = (subset != null && a.LastModifiedDate > subset.LastModifiedDate),
                                        Output = a}).ToList();
      foreach (var compareResult in compareResults)
      {
        if (compareResult.IsNew)
          this.Add(compareResult.Output);
        else if (compareResult.IsUpdate)
          this[this.IndexOf(this.FirstOrDefault(x => x.ID == compareResult.Output.ID))] = compareResult.Output;
      }
    }
  }

编辑:我犯了一个错误,不应该是a.LastModifiedDate > subset.LastModifiedDatesubset.LastModifiedDate > a.LastModifiedDate更新设置中,而且循环中也有一个小问题。

所以我基本上在做的是基于 ID 进行“左连接”。因此,如果 ID 未加入,则返回 null,但我们始终希望输出为“辅助列表”,这是因为如果我们需要更新或编辑,则需要使用列表 2 中的对象。如果有null 这意味着它不存在于列表一中,因此我们设置IsNew为 true 并IsUpdate在返回不为 null 并且返回结果修改了更新的日期时设置。

于 2012-09-24T09:07:03.353 回答