0

クラスがあるとしましょう。

Class A
{
    ID;
    Name;
    LastModifiedDate;
}

ListA1 と ListA2 の 2 つのリストがあります。

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 の新規/更新された項目を説明する 2 つの新しいリストが必要です。

更新:私が見ている出力は、

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
  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.LastModifiedDate編集:私は間違いを犯しました。更新の設定ではなくsubset.LastModifiedDate > a.LastModifiedDate、ループに小さな問題があったはずです。

つまり、私が基本的に行っているのは、ID に基づいて「左結合」を行うことです。したがって、ID が結合されていない場合は null が返されますが、常に出力を「セカンダリ リスト」にする必要があります。これは、更新または編集する必要がある場合、リスト 2 のオブジェクトを使用する必要があるためです。 null リスト 1 に存在しないことを意味するためIsNew、true に設定しIsUpdate、戻り値が null ではなく、戻り値の日付が変更されたより新しい場合に設定されます。

于 2012-09-24T09:07:03.353 に答える
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 に答える