使用 .在列表<类别>中删除

本文关键字:删除 类别 列表 使用 | 更新日期: 2023-09-27 18:31:57

尝试使用 .remove 从我的列表中删除内容.. 但它不起作用,给我错误"参数类型'字符串'不能分配给参数类型'System.Predicate'

  public void ManiPulateCategory(string categoryToManipulate)
   {
       createCategories = repository.Load(path);

       foreach (Category item in createCategories)
       {
          createCategories.Remove(item.CategoryName)
           }
       }

使用 .在列表<类别>中删除

我认为您正在尝试从类别列表中删除所有具有与categoryToManipulate匹配CategoryName的项目。

如果这是您想要的,您可以使用如下List.RemoveAll()来完成:

createCategories.RemoveAll
(
     catagory => catagory.CategoryName == categoryToManipulate
);

这是在List上使用一种方法,而不是来自IEnumerable的东西。如果您只有一个可用的IEnumerable,则必须使用不同的解决方案 - 但您说您有一个 List ,所以这应该有效。

这可以通过将所谓的谓词传递给RemoveAll()来工作。谓词只是采用某种类型的单个参数并返回 true 或 false 的方法。它将为列表中的每个元素调用一次,并将该元素作为参数传递。如果它返回 true,则将删除该元素。

在本例中,我没有为谓词创建单独的方法;相反,我编写了一个内联lambda expression来实现它。

createCategories.RemoveAll(x=>x.CategoryName == categoryToManipulate)

类似的东西?(已修复以反映评论,但最初由上面的Matthew Watson提出)

也看看这个答案

为了在列表中找到正确的项目,您必须覆盖 Equals 和 GetHashCode from Object。

class Category  {
    public override bool Equals(object obj)
    {
        if (!(obj is Category)) return false;
        return this.CategoryName == ((Category)obj).CategoryName;
    }
    public override int GetHashCode()
    {
        this.CategoryName.GetHashCodeU();
    }
}

现在,您可以在循环中调用createCategories.remove(item)