如何删除IEnumerable <myclass>?</myclass>中的项目

时间:2013-11-25 17:36:26

标签: c# .net lambda

如何从IEnumerable中删除符合特定条件的项目?

RemoveAll()不适用。

9 个答案:

答案 0 :(得分:11)

你不能; IEnumerable作为界面不支持删除。

如果您的IEnumerable实例实际上是支持删除的类型(例如List<T>),那么您可以转换为该类型并使用Remove方法。

或者,您可以根据自己的条件将项目复制到其他IEnumerable,也可以使用延迟评估的查询(例如Linq的.Where)来过滤IEnumerable苍蝇但是,这些都不会影响原始容器。

答案 1 :(得分:1)

这将产生一个新的集合,而不是修改现有的集合,但我认为这是用LINQ做的惯用方法。

    var filtered = myCollection.Where(x => x.SomeProp != SomValue);

另一种选择是使用Where生成一个新的IEnumerable<T>,其中包含您要删除的对象的引用,然后将其传递给原始集合上的Remove调用。当然,这实际上会消耗更多的资源。

答案 2 :(得分:1)

您无法从IEnumerable<T>中删除项目。您可以从ICollection<T>中删除项目,也可以从IEnumerable<T>过滤项目。

// filtering example; does not modify oldEnumerable itself
var filteredEnumerable = oldEnumerable.Where(...);
// removing example
var coll = (ICollection<MyClass>)oldEnumerable;
coll.Remove(item);

答案 3 :(得分:1)

您没有从IEnumerable 删除项目。这是不可能的。这只是一系列项目。您可以从生成序列的某些基础源中删除项目,例如,如果IEnumerable基于列表,则可以从该列表中删除项目。

您拥有的另一个选项是创建一个基于此序列的新序列,该序列从不显示给定项目。您可以使用Where执行此操作,但重要的是要意识到这不是删除项目,而是选择根据特定条件显示项目。

答案 4 :(得分:1)

正如大家已经说过的那样,你无法从IEnumerable中删除,因为这不是界面描述的内容。请考虑以下示例:

public IEnumerable<string> GetSomeStrings()
{
    yield return "FirstString";
    yield return "Another string";
}

显然,从IEnumerable中删除元素不是你可以合理做的事情,而是你必须在没有你不想要的情况下进行新的枚举。

yield键工作提供了其他示例,例如,您可以拥有无​​限列表:

public IEnumberable<int> GetPowersOf2()
{
    int value = 1;
    while(true)
    {
        yield return value;
        value = value * 2;
    }
}

答案 5 :(得分:0)

无法从IEnumerable<T>删除项目。来自documentation

  

公开枚举器,它支持对指定类型的集合进行简单迭代。

答案 6 :(得分:0)

您可以投射它并使用List<T>.RemoveAll(Predicate<T> match)这正是您所需要的。

答案 7 :(得分:0)

我就是这样做的,

html

答案 8 :(得分:-1)

如何尝试Enumerable.Empty,即

T obj = new T();
IEnumerable<T> myVar = new T[]{obj}    //Now myVar has an element
myVar = Enumerable.Empty<T>();        //Now myVar is empty