2016-07-29 23 views
1

Ich habe zwei beobachtbare Sammlungen. 1.TruckItems2.TruckItemsComparison. Beide sind genau gleich.Vergleichen von zwei Collections Daten miteinander

Ich lade Daten in die erste TruckItems Sammlung von EF6, dann 10 Sekunden später lade ich Daten in die zweite Sammlung TruckItemsComparison. Nun wurden die neuen Daten, die in meiner zweiten Sammlung hinzugefügt wurden, möglicherweise in letzter Zeit von einer anderen Quelle aktualisiert, und ich muss nur die neuesten Daten hinzufügen, die in meiner ersten Sammlung noch nicht vorhanden sind.

Ich möchte überprüfen, ob eine der IDs aus meiner zweiten Sammlung nicht mit den IDs in meiner ersten Sammlung übereinstimmt und dann nur die Elemente, die nicht übereinstimmen.

Code:

Hier ist, wo ich meine Daten laden:

private async void LoadTrucks() 
{ 
    using (TruckServiceClient service = new TruckServiceClient()) 
    { 
     var items = await service.GetTrucksAsync(); 

     if (TruckItems.Count == 0) 
     { 
      foreach (var item in items) 
      { 
       TruckItems.Add(new TruckItems 
       { 
        TruckId = item.TruckId, 
        TruckQuoteId = item.QuoteId, 
        TruckPhaseId = item.CurrentPhaseId, 
        TruckChassisManufacturer = item.ChassisManufacturer, 
        TruckChassisModel = item.ChassisModel, 
        TruckStatus = item.Status, 
        TruckJobNumber = item.JobNumbers, 
        TruckAddedBy = item.AddedBy, 
        TruckClientName = item.ClientName, 
        TruckClientSurname = item.ClientSurname, 
        TruckClientDetail = item.ClientDetail, 
        TruckCurrentPhase = item.CurrentPhase 
       }); 
      } 
     } 

     foreach (var item in items) 
     { 
      TruckItemsComparison.Add(new TruckItems 
      { 
       TruckId = item.TruckId, 
       TruckQuoteId = item.QuoteId, 
       TruckPhaseId = item.CurrentPhaseId, 
       TruckChassisManufacturer = item.ChassisManufacturer, 
       TruckChassisModel = item.ChassisModel, 
       TruckStatus = item.Status, 
       TruckJobNumber = item.JobNumbers, 
       TruckAddedBy = item.AddedBy, 
       TruckClientName = item.ClientName, 
       TruckClientSurname = item.ClientSurname, 
       TruckClientDetail = item.ClientDetail, 
       TruckCurrentPhase = item.CurrentPhase 
      }); 
     } 
    } 
} 

Und hier ist, wo ich meine zwei Sammlungen vergleichen möchten:

public void UpdateTrucks() 
{ 
    LoadTrucks(); 

    if (TruckItems.Count != 0) 
    { 
     var truckItemsId = TruckItems.Where(x => x.TruckId != 0).First().TruckId; 
     foreach (var item in TruckItemsComparison.Where(x => x.TruckId != truckItemsId)) 
     { 
      TruckItems.Add(item); 
     } 
    } 
} 

Mein Problem ist, dass es fügt die Daten aus den beiden Sammlungen zusammen, unabhängig davon, ob die IDs übereinstimmen oder nicht. Offensichtlich funktioniert meine Logik hier nicht, also kann mir bitte jemand einen Weg zeigen, wie ich die Daten vergleichen kann und nur IDs einfügen, die in meiner TruckItems Sammlung noch nicht existieren. Danke und bitte lassen Sie mich wissen, wenn Sie any weitere Informationen benötigen.

Antwort

1

Sie durch jede der Artikel im TruckItemsComparison unter Verwendung Except aufzählen kann:

public void UpdateTrucks() 
{ 
    LoadTrucks(); 

    if (TruckItems.Count != 0) 
    { 
     foreach (var item in TruckItemsComparison.Except(TruckItems)) 
     { 
      TruckItems.Add(item); 
     } 
    } 
} 

Wenn alles, was Sie tun möchten, die Ids Ihrer TruckItems ist zu vergleichen, dann können Sie implementieren Ihre eigenen IEqualityComparer:

internal class TruckItemsComparer : IEqualityComparer<TruckItems> 
{ 
    #region IEqualityComparer Members 

    public bool Equals(TruckItems x, TruckItems y) 
    { 
     return (((x == null) && (y == null)) || 
      ((x != null) && (y != null) && x.TruckId == y.TruckId)); 
    } 

    public int GetHashCode(TruckItems obj) 
    { 
     return obj. TruckId.GetHashCode(); 
    } 

    #endregion 
} 

Und dann verwenden wie so:

foreach (var item in TruckItemsComparison.Except(TruckItems, new TruckItemsComparer())) 
+0

Wie bist du so schlau? : P Vielen Dank, Mann! Die zweite Methode hat perfekt funktioniert. – CareTaker22