C# 列表<;类型>;去除
有人给我解释一下: 我试图从另一个字符串列表中包含匹配ID的列表中删除项目 第一步如下: 我正在尝试从MyListingSyncID中删除ListingNumber与lstListingsUpdated24小时中的ListingNumber匹配的项目 [0]处的项等于lstListingsUpdatedIn24Hrs中的值,如步骤2所示: 但如步骤3所示:删除失败: 然后在执行RemoveAll(func)步骤4之后:Remove工作 有人解释为什么删除(项目)不起作用,请 代码:C# 列表<;类型>;去除,c#,asp.net,list,C#,Asp.net,List,有人给我解释一下: 我试图从另一个字符串列表中包含匹配ID的列表中删除项目 第一步如下: 我正在尝试从MyListingSyncID中删除ListingNumber与lstListingsUpdated24小时中的ListingNumber匹配的项目 [0]处的项等于lstListingsUpdatedIn24Hrs中的值,如步骤2所示: 但如步骤3所示:删除失败: 然后在执行RemoveAll(func)步骤4之后:Remove工作 有人解释为什么删除(项目)不起作用,请 代码: my
myListingSyncId.AddRange(myListingSync.Listings);
#区域删除过去24小时内获取的列表引用
//列出过去24小时内获取的引用
//这些将被排除在外,以优化应用程序的运行。
//基本上意味着所有列表的完全同步
//每24小时仅进行一次
//因此,如果每小时运行一次,则不会减慢最近添加的内容
List lstListingsUpdatedIn24Hrs=DAL.PropertyPortalDAL.GetSahtWebserviceUpdatesIn24Hrs();
在24小时内列出我的列表=
lstListingsUpdatedIn24Hrs.Select(p=>newp24syncservice.ListingSyncItem()
{
ListingNumber=p,
状态=P24SyncService.ListingState.AddedModified
}).ToList();
foreach(P24SyncService.ListingSyncItem myLSI在MyListingSupdatedin24小时内)
{
myListingSyncId.Remove(myLSI);
}
myListingSyncId.RemoveAll(p=>lstListingsUpdatedIn24Hrs.Contains(p.ListingNumber));
#端区
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;
}
}
}
公共部分类ListingSyncItem{
私有字符串列表numberfield;
私有列表状态字段;
///
公共字符串列表编号{
得到{
返回此.listingNumberField;
}
设置{
this.listingNumberField=值;
}
}
///
公开上市状态{
得到{
返回此.status字段;
}
设置{
this.statusField=值;
}
}
}
猜测一下,您的ListingSyncItem
类型不会覆盖Equals
,因此List.Remove
不知道要删除的项与列表中的项“相等”
只需适当地重写Equals
和GetHashCode
(检查列表编号
和状态
的相等性,并基于它们构建哈希代码)就可以解决问题
对于
RemoveAll
,您提供了一个谓词。这没有使用ListingSyncItem.Equals
,这就是它工作的原因。猜测一下,您的ListingSyncItem
类型没有覆盖Equals
,因此List.Remove
不知道要删除的项目与列表中的项目“相等”
只需适当地重写Equals
和GetHashCode
(检查列表编号
和状态
的相等性,并基于它们构建哈希代码)就可以解决问题
对于
RemoveAll
,您提供了一个谓词。这没有使用ListingSyncItem.Equals
,这就是它工作的原因。如果没有看到ListingSyncItem的定义,我无法确定,但我猜这与您有两个引用同一项的实例有关
您知道,具有相同ListingNumber的两个不同实例引用相同的概念对象,但列表没有。默认情况下,.NET知道如果两个对象共享同一实例,则它们是相同的,但由于您正在内部lambda函数中创建一个新的ListingSyncItem,因此不会删除它
您应该做的是在ListingSyncItem类中实现IEquatable,并使其对于具有相同ListingNumber的两个对象返回True。然后列表将知道如何从列表中删除正确的项。如果没有看到ListingSyncItem的定义,我无法确定,但我猜这与您有两个引用同一项的实例有关 您知道,具有相同ListingNumber的两个不同实例引用相同的概念对象,但列表没有。默认情况下,.NET知道如果两个对象共享同一实例,则它们是相同的,但由于您正在内部lambda函数中创建一个新的ListingSyncItem,因此不会删除它
您应该做的是在ListingSyncItem类中实现IEquatable,并使其对于具有相同ListingNumber的两个对象返回True。然后列表将知道如何从列表中删除正确的项。如前所述,这是因为您没有覆盖相等项。 默认情况下,它将检查ref相等性。显然,情况并非如此
要么重写Equals和GetHashCode,要么使用某种方法获取正确的引用(例如lambdas)如上所述,这是因为您没有重写Equals。 默认情况下,它将检查ref相等性。显然,情况并非如此
重写Equals和GetHashCode,或者使用某种方法获取正确的引用(例如lambdas)如果您可以将代码作为文本而不是屏幕截图放置不是更好吗如果您可以将代码作为文本而不是屏幕截图放置不是更好吗
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;
}
}
}