2012-02-29 3 views
1

누군가 내게이에게 설명 제거목록 <Type>

내가 문자열의 다른 목록에 포함 된 ID를 일치 목록에서 항목을 삭제하려합니다.

1 단계는 다음과 같습니다 : Step1

내가 ListingNumber이 lstListingsUpdatedIn24Hrs에 ListingNumbers 일치 myListingSyncIDs에서 항목을 삭제하는 것을 시도하고있다.

의 항목 [0] 단계 2에 나타낸 바와 같이 lstListingsUpdatedIn24Hrs에서 값을 같음 : Step2

을하지만 3 단계에 나타낸 바와 같이 다음 제거는 실패 Step3

그럼에서 removeAll을 수행 한 후 (FUNC) 4 단계는 다음 제거는 제거 (항목)이 작동하지 않는 이유

Step4

누군가가 설명 작동 ...

코드하십시오 :

 myListingSyncIDs.AddRange(myListingSync.Listings); 

     #region Remove Listing References Fetched In The Last 24Hrs 
     // Listing References Fetched In The Last 24Hrs 
     // These will be excluded to optimise the running of the App. 
     // Basically meaning that a complete sync of all listings 
     // will only be done once every 24hrs 
     // So that if this is run every hr, it will not slow down the most recent additions 
     List<String> lstListingsUpdatedIn24Hrs = DAL.PropertyPortalDAL.GetSahtWebserviceUpdatesIn24Hrs(); 
     List<P24SyncService.ListingSyncItem> myListingsUpdatedIn24Hrs = 
      lstListingsUpdatedIn24Hrs.Select(p => new P24SyncService.ListingSyncItem() 
      { 
       ListingNumber = p, 
       Status = P24SyncService.ListingState.AddedModified 
      }).ToList(); 
     foreach (P24SyncService.ListingSyncItem myLSI in myListingsUpdatedIn24Hrs) 
     { 
      myListingSyncIDs.Remove(myLSI); 
     } 

     myListingSyncIDs.RemoveAll(p => lstListingsUpdatedIn24Hrs.Contains(p.ListingNumber)); 

     #endregion 

ListingSyncItem은 다음과 같습니다 추측에서

public partial class ListingSyncItem { 

    private string listingNumberField; 

    private ListingState statusField; 

    /// <remarks/> 
    public string ListingNumber { 
     get { 
      return this.listingNumberField; 
     } 
     set { 
      this.listingNumberField = value; 
     } 
    } 

    /// <remarks/> 
    public ListingState Status { 
     get { 
      return this.statusField; 
     } 
     set { 
      this.statusField = value; 
     } 
    } 
} 
+1

텍스트 대신 스크린 샷과 같이 코드를 삽입 할 수 있다면 더 나은되지 않을 것 – AnarchistGeek

답변

3

, 당신의 ListingSyncItem 유형은 그래서 List<T>.Remove는 항목을 알고하지 않습니다, Equals을 무시하지 않습니다 제거 할 항목은 목록의 항목과 "동일"합니다.

는 간단하게 문제를 해결해야한다 (이들에 근거하는 해시 코드를 아마도 ListNumberStatus의 평등을 확인하고 건설) 적절하게 EqualsGetHashCode를 오버라이드 (override).

RemoveAll의 경우, 조건자를 제공하고 있습니다. 그것은 ListingSyncItem.Equals을 사용하지 않기 때문에 작동합니다.

1

ListingSyncItem의 정의를 보지 않고서는 확신 할 수 없지만, 동일한 항목을 참조하는 두 개의 인스턴스가 있다는 사실과 관련이 있습니다.

동일한 ListingNumber의 두 인스턴스가 동일한 개념적 개체를 참조하지만 List <>은 알 수 없습니다. 기본적으로 .NET은 동일한 인스턴스를 공유하는 두 객체가 동일하다는 것을 알고 있지만 내부 람다 함수에서 새 ListSyncItem을 작성하기 때문에 제거되지 않습니다.

당신이해야 할 일은 ListSyncItem 클래스에 IEquatable을 구현하고 동일한 ListingNumber를 가진 두 객체에 대해 True를 반환하도록하는 것입니다. 그런 다음 List는 목록에서 올바른 항목을 제거하는 것을 알게됩니다.

0

명시된 바와 같이, 귀하가 Equals를 재정의하지 않기 때문입니다. 기본적으로 참조 평등을 검사합니다. 분명히 여기에 해당하지 않습니다.

어느 재정의 같음과 GetHashCode 또는 올바른 참조를 (예를 들어 람다)를 얻기의 어떤 방법을 사용