我有一个无数的对象foo
。
public IEnumerable<foo> listOfFoo{ get; set; }
Foo有Id,名字可以说。
我想将ID传递给方法,该方法应该从IEnumerable中删除具有该ID的对象并将其返回。
最好的办法是什么?
答案 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