2012-02-29 23 views
1

誰かが私これに説明削除:一覧<Type>

が、私は、文字列の別のリストに含まれているIDが一致すると、リストから項目を削除しようとしています。

ステップ1は以下の通りです: Step1

私はListingNumberはlstListingsUpdatedIn24HrsでListingNumbersと一致するmyListingSyncIDsからアイテムを削除しようとしています。ステップ2に示すように[0]で

アイテムは、lstListingsUpdatedIn24Hrsからの値に等しい: Step2

しかし、ステップ3に示すように:削除が失敗した: Step3

そしてREMOVEALLを行った後( FUNC)ステップ4:削除は、Remove(アイテム)が動作しない理由を

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タイプはEqualsを上書きしないので、List<T>.Removeは、その項目を知っていません削除するにはあなたのリストの項目と "等しい"。

は、単に問題を修正する必要があります(おそらく、ListNumberStatusの等価性をチェックし、それらに基づくハッシュコードをビルドするために)適切EqualsGetHashCodeをオーバーライド。

RemoveAllについては、述語を提供しています。それはListingSyncItem.Equalsを使用しないため、動作しています。

1

私は、ListSyncItemの定義を見ることなく確信することはできませんが、これは、同じアイテムを参照する2つのインスタンスがあるという事実と関係していると思います。

同じListNumberを持つ2つの異なるインスタンスが同じ概念オブジェクトを参照していますが、リスト<はそうではありません。デフォルトでは、.NETは同じインスタンスを共有する場合、2つのオブジェクトが同一であることを認識しますが、内部のラムダ関数で新しいListSyncItemを作成するため、削除されません。

あなたは、ListSyncItemクラスにIEquatableを実装し、同じListNumberを持つ2つのオブジェクトに対してTrueを返すようにします。 Listは、リストから適切な項目を削除することを知っています。

0

説明したように、あなたは等価を上書きしていないからです。 デフォルトでは、参照一致がチェックされます。明らかに、ここではそうではありません。

どちらのオーバーライドが等しいとGetHashCodeメソッドまたはテキストの代わりのスクリーンショットのようにあなたのコードを置くことができれば、正しい参照を取得するいくつかの方法を使用する(例えば、ラムダ)