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

5

可能是重复问题:
C#:如何在IEnumerable中删除项

我有一个对象 foo 的可枚举集合。

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

假设Foo有ID和名称。

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

最好的方法是什么?


2
哈哈,我忍不住了... - Adam Houldsworth
4个回答

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引用的其他内容都不会看到任何更改。


3

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


但您可以在底层集合中进行更改(例如,如果它是 List 或其他类型),或使用 Where 子句筛选 IEnumerable

如果您需要删除项目,则应使用支持删除项目的集合,例如 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));

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;
}

谢谢,我最终采用了你的方法。我认为使用数组索引没有问题,对吧? - Diego

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接