C#使用.Remove List <category> </category>

时间:2014-11-25 12:22:00

标签: c# list properties

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

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


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

3 个答案:

答案 0 :(得分:3)

我认为您试图从类别列表中删除CategoryName匹配categoryToManipulate的所有项目。

如果这是你想要的,你可以使用List.RemoveAll()这样做:

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

这是使用List上的方法,而不是来自IEnumerable的方法。如果您只有IEnumerable可用,则必须使用其他解决方案 - 但您说您有List,所以这应该有用。

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

在这种情况下,我没有为谓词创建单独的方法;相反,我写了一个内联lambda expression来实现它。

答案 1 :(得分:1)

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

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

另请查看此Answer

答案 2 :(得分:0)

为了在列表中找到正确的项目,您必须从Object重写Equals和GetHashCode。

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)