可能是重复问题:
C#:如何在IEnumerable中删除项
我有一个对象 foo
的可枚举集合。
public IEnumerable<foo> listOfFoo{ get; set; }
假设Foo有ID和名称。
我想将一个ID传递给一个方法,该方法应该从IEnumerable中删除具有该ID的对象并返回它。
最好的方法是什么?
可能是重复问题:
C#:如何在IEnumerable中删除项
我有一个对象 foo
的可枚举集合。
public IEnumerable<foo> listOfFoo{ get; set; }
假设Foo有ID和名称。
我想将一个ID传递给一个方法,该方法应该从IEnumerable中删除具有该ID的对象并返回它。
最好的方法是什么?
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
引用的其他内容都不会看到任何更改。
您不能简单地从 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));
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;
}
IEnumarable是一个用于遍历集合的接口,如果想要删除其中的元素就必须将其转换为某种类型的集合。
详细信息请参见:
http://msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.aspx