C#在列表中使用.Remove<;类别>;
正在尝试使用。remove可从我的列表中删除内容。。但它不起作用,给我一个错误“参数类型'string'不可分配给参数类型'System.Predicate'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)
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
。但是您不能修改通过枚举器迭代的列表,您将得到另一个错误。createCategories.remove(项)”
在你的循环中”:你不能同时枚举一个列表并从中删除项目,因为你会得到InvalidOperationException
。关于“现在你可以调用在你的循环中删除(项目)
”“:您不能同时枚举列表并从中删除项目,因为您将获得InvalidOperationException
。我没有否决投票,但由于集合被修改,此代码将在循环中引发异常。”。即使它没有抛出异常,也只会从集合中删除所有项。公平地说,我的答案是基于错误“”参数类型“string”不可分配给参数类型“System.Predicate”“。正在说明谓词。也许我应该更详细一点:)我是否应该删除这个答案,因为修复它将是马修·沃森发布的内容的副本?好吧,这取决于你,但没有什么意义