从自定义列表中删除项目

本文关键字:删除项目 列表 自定义 | 更新日期: 2023-09-27 18:01:20

我有一个List<Fill> items

这是Fill类:

public class Fill
{
    public string arret { get; set;}
    public string ligneSens { get; set;}
}

如何使用字符串值arretligneSens从这个列表中删除一个项目?

的例子:

void OnDelete(object sender, EventArgs e, string arretName, string ligneSensName)
{
    var aFill = new Fill
    {
        arret = arretName,
        ligneSens = ligneSensName
    };
    items.Remove(aFill); //<--- this doesn't work
}

很抱歉,我不知道怎么问这个问题。

从自定义列表中删除项目

您应该覆盖objectEqualsGetHashCode方法。当你在引用类型(类)上调用Remove时,它将通过它的Equals方法寻找一个。

public class Fill
{
    public string arret { get; set; }
    public string ligneSens { get; set; }
    public override bool Equals(object obj)
    {
        var other = obj as Fill;
        if(other == null)
            return false;
        return other.arret == arret && other.ligneSens == ligneSens;
    }
    public override int GetHashCode()
    {
        return arret.GetHashCode() ^
               ligneSens.GetHashcode();
    }
}

关于GetHashCode()在线覆盖搜索的最佳实践是什么,有很多问题

另一种方法是通过传递一个谓词来对集合中的每个项求值,从而明确地说明要删除的内容:

items.RemoveAll(item => item.arret = arretName &&  
                        item.ligneSens == ligneSensName);

你必须使用RemoveAll(),目前你正在传递一个新创建的对象,关于items没有信息,因为它是一个新的引用而不是相同的引用:

void OnDelete(object sender, EventArgs e, string arretName, string ligneSensName)
{
   items.RemoveAll(item => item.arret == arretName &&  item.ligneSens == ligneSensName);
}

Use List API RemoveAll

items.RemoveAll(x => x.arret.Equals("value") && x.ligneSensName.Equals("ligneValue"));