C# 如何删除IEnumerable中的项<;MyClass>;?

C# 如何删除IEnumerable中的项<;MyClass>;?,c#,.net,lambda,C#,.net,Lambda,如何从IEnumerable中删除符合特定条件的项 RemoveAll()不适用。这将生成一个新集合,而不是修改现有集合,但是我认为这是使用LINQ的惯用方法 var filtered = myCollection.Where(x => x.SomeProp != SomValue); 另一个选项是使用Where生成一个新的IEnumerable,其中引用了要删除的对象,然后将其传递给原始集合上的Remove调用。当然,这实际上会消耗更多的资源。项不能从IEnumerable中删

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


RemoveAll()不适用。

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

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

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

项不能从
IEnumerable
中删除。从:

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


无法从
IEnumerable
中删除项。您可以从
ICollection
中删除项目,或从
IEnumerable
中筛选项目

//过滤示例;不修改oldEnumerable本身
var filteredEnumerable=oldEnumerable.Where(…);
//删除示例
var coll=(ICollection)oldEnumerable;
coll.移除(项目);
您不能从
IEnumerable
中删除项目。这是不可能的。这只是一系列的项目。您可以从生成序列的某些基础源中删除项,例如,如果
IEnumerable
基于列表,则可以从该列表中删除项


另一个选项是在这个序列的基础上创建一个新序列,该序列从不显示给定的项。您可以使用
Where
,但重要的是要意识到这不是删除项目,而是根据特定条件选择显示项目<代码>IEnumerable作为接口不支持删除

如果您的
IEnumerable
实例实际上属于支持删除的类型(例如
List
),则可以强制转换为该类型并使用
Remove
方法


或者,您可以根据您的条件将项目复制到不同的
IEnumerable
,或者您可以使用惰性计算查询(例如使用Linq的
。Where
)动态筛选
IEnumerable
)。但是,这两个都不会影响您的原始容器。

正如每个人都已经说过的那样,您不能从IEnumerable中删除,因为这不是接口所描述的内容。考虑下面的例子:

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

您可以强制转换它并使用
列表。RemoveAll(谓词匹配)
这正是您所需要的。

试试
可枚举的.Empty
如何

T obj = new T();
IEnumerable<T> myVar = new T[]{obj}    //Now myVar has an element
myVar = Enumerable.Empty<T>();        //Now myVar is empty
T obj=new T();
IEnumerable myVar=newt[]{obj}//现在myVar有了一个元素
myVar=Enumerable.Empty()//现在myVar是空的
我就是这样做的

IEnumerable<T> myVar=getSomeData(); // Assume mayVar holds some data

myVar=myVar.Where(d=>d.Id>10); // thats all, i want data with Id>10 only
IEnumerable myVar=getSomeData();//假设mayVar持有一些数据
myVar=myVar.Where(d=>d.Id>10);//仅此而已,我只需要Id>10的数据

你有一个类定义和标准吗?这个类的可能重复将产生一个新的集合?@AustinSalonen使用
Where
将产生一个新的集合。LINQ查询通常不会修改现有集合,而是生成一个新的带有结果集的
IEnumerable
@蒂姆斯。他在回答中暗示了这一点。另请参见我在@Steve上关于类似主题的另一个问题的回答,正如我在回答中所述,您可以从某个集合中删除项,该集合是
IEnumerable
的基础数据源。这仍然不是从
IEnumerable
中删除项,而是从基础数据源中删除项。您的权利-我没有仔细阅读您的答案:)为变量指定新值不会影响原始值。在我的情况下,代码正在
IEnumerable
上执行
.Aggregate
。我按照丹的建议插入了一个
.Where
过滤器,例如
foo.Where(条件).Aggregate(表达式)
。它就像一个符咒。
T obj = new T();
IEnumerable<T> myVar = new T[]{obj}    //Now myVar has an element
myVar = Enumerable.Empty<T>();        //Now myVar is empty
IEnumerable<T> myVar=getSomeData(); // Assume mayVar holds some data

myVar=myVar.Where(d=>d.Id>10); // thats all, i want data with Id>10 only