2016-07-29 5 views
1

두 개의 관찰 가능한 컬렉션이 있습니다. TruckItemsTruckItemsComparison. 둘 다 똑같습니다.두 개의 컬렉션 데이터를 서로 비교하십시오.

EF6의 첫 번째 TruckItems 컬렉션에 데이터를로드 한 다음 10 초 후 데이터를 두 번째 컬렉션 TruckItemsComparison에로드합니다. 최근에 제 2 컬렉션에 추가 된 새 데이터가 최근에 다른 소스에서 업데이트되었을 수 있으며 아직 첫 번째 컬렉션에없는 최신 데이터 만 추가해야합니다.

두 번째 컬렉션의 ID 중 ANY가 첫 번째 컬렉션의 ID와 일치하지 않는지 확인한 다음 일치하지 않는 항목 만 추가하고 싶은지 확인하고 싶습니다.

CODE :

내 데이터로드 여기

입니다 :

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); 
     } 
    } 
} 

내 문제는 그것이 추가하는 것입니다 : 내 두 컬렉션을 비교하려는 경우 여기

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 
      }); 
     } 
    } 
} 

그리고이입니다 ID가 일치하는지 여부에 관계없이 두 컬렉션의 데이터를 함께 수집합니다. 분명히 여기 내 논리가 작동하지 않습니다, 그래서 아무도 날 데이터를 비교할 수있는 방법을 보여 주면 내 TruckItems 컬렉션에 아직 존재하지 않는 ID를 삽입 할 수 있습니다. 고마워요. any 자세한 정보가 필요하면 알려주세요.

답변

1
당신은 Except 사용하여 TruckItemsComparison의 각 항목을 열거 할 수

: 당신이 원하는 모든 당신이 구현할 수있는 TruckItems의 ID를 비교하는 경우

public void UpdateTrucks() 
{ 
    LoadTrucks(); 

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

을 자신의 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 
} 

그리고은과 같이 사용

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

어떻게 그렇게 똑똑해? : P 고맙습니다. 두 번째 방법은 완벽하게 작동했습니다. – CareTaker22

관련 문제