在列表中查找对象,删除并返回它

时间:2012-09-28 08:30:29

标签: c# list ienumerable

  

可能重复:
  c#: how do I remove an Item inside IEnumerable

我有一个无数的对象foo

 public IEnumerable<foo> listOfFoo{ get; set; }

Foo有Id,名字可以说。

我想将ID传递给方法,该方法应该从IEnumerable中删除具有该ID的对象并将其返回。

最好的办法是什么?

4 个答案:

答案 0 :(得分:5)

IEnumerable是只读的。您无法从中删除对象。

那就是说,你可以做点什么

public Foo QuoteRemoveUnquoteById(int id)
{
    var rtnFoo = listOfFoo.SingleOrDefault(f => f.Id == id);
    if (rtnFoo != default(Foo))
    {
        listOfFoo = listOfFoo.Where(f => f.Id != id);
    }
    return rtnFoo;
}

只是屏蔽了匹配的Foo?但是,“删除”的项目越多,性能越差越好。此外,其他任何引用listOfFoo的内容都不会发生任何变化。

答案 1 :(得分:3)

您不能简单地从IEnumerable删除项目。


但您可以对基础集合进行更改(例如,如果它是List或其他内容),或使用IEnumerable子句过滤Where

如果您需要删除项目,则应使用支持删除项目的集合,例如List<>


例如,您的支持字段可以是List<foo>类型:

private List<foo> _listOfFoo;

public IEnumerable<foo> listOfFoo 
{ 
    get { return _listOfFoo.AsReadOnly(); } 
    set { _listOfFoo = value.ToList(); } 
}

然后从_listOfFoo中删除项目。

_listOfFoo.Remove(_listOfFoo.Single(foo => foo.ID == id_to_remove));

答案 2 :(得分:3)

对于任何实现IEnumerable<foo>的集合而言,这是不可能的。例如,如果是List<foo>,则可以为其删除项目,但如果是foo[],则无法删除项目。

如果您改为使用List<foo>

public foo Extract(int id) {
  int index = listOfFoo.FindIndex(x => x.Id == id);
  foo result = listOfFoo[index];
  listOfFoo.removeAt(index);
  return result;
}

答案 3 :(得分:2)

IEnumerable是一个用于通过集合进行迭代的接口,如果不转换为某种集合,就无法移除项目。

在这里阅读更多内容:

http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx