C#在列表中使用.Remove<;类别>;

C#在列表中使用.Remove<;类别>;,c#,list,properties,C#,List,Properties,正在尝试使用。remove可从我的列表中删除内容。。但它不起作用,给我一个错误“参数类型'string'不可分配给参数类型'System.Predicate' public void ManiPulateCategory(string categoryToManipulate) { createCategories = repository.Load(path); foreach (Category item in createCategories)

正在尝试使用。remove可从我的列表中删除内容。。但它不起作用,给我一个错误“参数类型'string'不可分配给参数类型'System.Predicate'

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


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

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

如果这是您想要的,您可以使用类似的方式:

这是在
列表
上使用的方法,而不是
IEnumerable
中的方法。如果您只有一个
IEnumerable
可用,则必须使用不同的解决方案-但您说您有一个
列表
,因此这应该是可行的

这是通过将谓词传递给
RemoveAll()
来实现的。谓词只是一个方法,它接受特定类型的单个参数,并返回true或false。它将为列表中的每个元素调用一次,作为参数传递给该元素。如果返回true,则该元素将被删除


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

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

如果这是您想要的,您可以使用类似的方式:

这是在
列表
上使用的方法,而不是
IEnumerable
中的方法。如果您只有一个
IEnumerable
可用,则必须使用不同的解决方案-但您说您有一个
列表
,因此这应该是可行的

这是通过将谓词传递给
RemoveAll()
来实现的。谓词只是一个方法,它接受特定类型的单个参数,并返回true或false。它将为列表中的每个元素调用一次,作为参数传递给该元素。如果返回true,则该元素将被删除


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

为了在列表中找到正确的项,您必须重写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)
在循环中。

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

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.RemoveAll(x=>x.CategoryName == categoryToManipulate)
现在,您可以在循环中调用
createCategories.remove(item)

createCategories.RemoveAll(x=>x.CategoryName == categoryToManipulate)
类似的东西?(固定反映评论,但最初由Matthew Watson提出)

也看看这个

类似的东西?(固定反映评论,但最初由Matthew Watson提出)



另外,请看一下这个

当您传递
字符串
时,您需要传递类型为
类别
Remove
方法对象作为参数,这里有一些潜在的问题。
Remove
方法将
T
作为参数,在这种情况下是
类别
。但是您不能修改列表正在通过其枚举器迭代的,您将得到另一个错误。
Remove
方法然后使用该类型的相等实现,如果找不到,则使用默认的相等实现。foreach(CreateColutions中的类别项){CreateColutions.Remove(item);}//没有给我任何错误,但它没有做我希望它做的事情。请阅读此帮助文章。问题标题中的标记也是多余的。请注意,这不是一个论坛。您不需要在问题中包含正确的答案。如果您想发布您自己的解决方案,则只需将其作为答案发布。您需要传入一个
删除
我类型为
Category
的thod对象作为参数,当您传递
string
时,这里有一些潜在的问题。
Remove
方法将
T
作为参数,在本例中为
Category
。但是您不能修改通过枚举器迭代的列表,您将得到另一个错误。de>Remove方法然后使用类型的相等实现,如果找不到,则使用默认相等实现。foreach(createCategories中的类别项){createCategories.Remove(项);}//没有给我任何错误,但它没有做我希望它做的事情。请阅读这篇帮助文章。问题标题中的标记也是多余的。请注意,这不是一个论坛。你不需要在问题中包含正确的答案。如果你想发布你自己的解决方案,那么只需将其作为答案发布即可。谢谢你,节省了我的时间。@DangerCoder如果你需要的话想要欣赏某人,你可能需要使用标准的SO机制-例如接受答案和向上投票。谢谢你,拯救了我的一天。@DangerCoder如果你想欣赏某人,你可能需要使用标准的SO机制-例如接受答案和向上投票。关于“现在你可以调用
createCategories.remove(项)”
在你的循环中”:你不能同时枚举一个列表并从中删除项目,因为你会得到
InvalidOperationException
。关于“现在你可以调用
在你的循环中删除(项目)
”“:您不能同时枚举列表并从中删除项目,因为您将获得
InvalidOperationException
。我没有否决投票,但由于集合被修改,此代码将在循环中引发异常。”。即使它没有抛出异常,也只会从集合中删除所有项。公平地说,我的答案是基于错误“”参数类型“string”不可分配给参数类型“System.Predicate”“。正在说明谓词。也许我应该更详细一点:)我是否应该删除这个答案,因为修复它将是马修·沃森发布的内容的副本?好吧,这取决于你,但没有什么意义