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