5

可能重复:
c#:如何删除 IEnumerable 中的项目

我有无数对象foo

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

Foo 有 Id 和 name 让我们说。

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

最好的方法是什么?

4

4 回答 4

5

IEnumerables 是只读的。你不能从一个对象中删除一个对象。

也就是说,你可以做类似的事情

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不会看到任何变化。

于 2012-09-28T08:34:32.677 回答
3

您不能简单地从IEnumerable.


但是您可以在基础集合中进行更改(例如,如果它是 aList或其他东西),或者过滤IEnumerableusing 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));
于 2012-09-28T08:34:51.843 回答
2

这对于任何实现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;
}
于 2012-09-28T08:35:20.427 回答
2

IEnumarable 是一个用于遍历集合的接口,如果不强制转换为某种集合,就无法删除项目。

在这里阅读更多:

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

于 2012-09-28T08:36:23.887 回答