如何从IEnumerable中删除符合特定条件的项目?
RemoveAll()不适用。
答案 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