c#
  • c#-4.0
  • 2012-09-24 89 views 0 likes 
    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' }) 
    

    現在,我需要比較ListA1和ListA2通過比較LastModifiedDate。我需要兩個新的List,描述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' } 
    } 
    
    +0

    如果列表1中修改的最後日期比列表2中的更新,那麼這是更新還是新項目?如果第二個列表有一個更新的日期修改它是一個更新,我接受它? – LukeHennerley

    +0

    @LukeHennerley,是的,如果存在於新列表中,則更新否則添加。 – user960567

    +0

    爲什麼有ListA3? –

    回答

    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; 
    

    您可以枚舉這些序列,做任何你需要做的,添加或更新新的/更改的項目。

    +0

    更新我的問題 – user960567

    +0

    @ user960567:編輯我的答案。 –

    +0

    這看起來很不錯。謝謝 – user960567

    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當發生這種情況,你應該在理論上要被添加到ListA1然後ID 1和2更新ID 4從ListA2所以輸出應該是

    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中的對象。如果有這意味着它不存在於列表1中,因此我們將IsNew設置爲true,並且如果返回值不爲空且返回結果具有更新的更新日期,則設置爲IsUpdate

    +0

    沒有工作代碼。 – user960567

    +0

    請參閱編輯以解決問題 - 什麼不工作? – LukeHennerley

    +0

    我把這個新的控制檯應用程序,並獲得錯誤。親自嘗試一下。 – user960567

    相關問題