2012-02-29 62 views
1

有人向我解釋這一點:列表<Type>刪除

我試圖從匹配包含在字符串的另一個列表ID的列表刪除項目。

第1步是如下: Step1

我試圖從myListingSyncIDs其中ListingNumber在lstListingsUpdatedIn24Hrs匹配ListingNumbers刪除項目。

在項[0]等於從lstListingsUpdatedIn24Hrs的值,如步驟2: Step2

但如圖第三步:使用刪除失敗: Step3

然後做一個removeall過之後( FUNC)第四步:在刪除Works

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 2012-02-29 09:32:58

回答

3

在猜測,你ListingSyncItem類型不會覆蓋Equals,所以List<T>.Remove不知道該項目刪除與您的列表中的項目「相等」。

只需重寫EqualsGetHashCode適當地(以檢查ListNumberStatus,想必平等,並建立基於這些的哈希碼)應該解決這個問題。

對於RemoveAll,您提供了一個謂詞。那不使用ListingSyncItem.Equals,這就是它工作的原因。

1

我不能確定沒有看到ListingSyncItem的定義,但我猜這與你有兩個引用同一項的實例有關。

您知道具有相同ListingNumber的兩個不同實例引用同一個概念對象,但列表<>不。默認情況下,如果.NET共享同一個實例,則知道兩個對象是相同的,但是由於您在內部lambda函數中創建了新的ListingSyncItem,因此它不會被刪除。

你應該做的是在你的ListingSyncItem類中實現IEquatable,並使它對於具有相同ListingNumber的兩個對象返回True。然後列表將知道從列表中刪除正確的項目。

0

如上所述,這是因爲你並沒有壓倒Equals。 默認情況下,它將檢查ref是否相等。顯然,這裏沒有這種情況。

要麼重寫equals和GetHashCode或使用得到正確的參考(例如lambda表達式)的一些方法