可能重复:
c#:如何删除 IEnumerable 中的项目
我有无数对象foo
。
public IEnumerable<foo> listOfFoo{ get; set; }
Foo 有 Id 和 name 让我们说。
我想将一个 ID 传递给一个方法,该方法应该从 IEnumerable 中删除具有该 ID 的对象并返回它。
最好的方法是什么?
可能重复:
c#:如何删除 IEnumerable 中的项目
我有无数对象foo
。
public IEnumerable<foo> listOfFoo{ get; set; }
Foo 有 Id 和 name 让我们说。
我想将一个 ID 传递给一个方法,该方法应该从 IEnumerable 中删除具有该 ID 的对象并返回它。
最好的方法是什么?
IEnumerable
s 是只读的。你不能从一个对象中删除一个对象。
也就是说,你可以做类似的事情
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
.
但是您可以在基础集合中进行更改(例如,如果它是 aList
或其他东西),或者过滤IEnumerable
using aWhere
子句。
如果您需要删除项目,则应使用支持删除项目的集合,例如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>
. 如果它是例如 a List<foo>
,那么它可以为它删除项目,但如果它是例如 afoo[]
则不可能删除项目。
如果您使用 aList<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/en-us/library/system.collections.ienumerable.aspx