2012-02-29 140 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表达式)的一些方法