从IEnumerable <T>中删除项目

Max*_*xim 45 c# linq ienumerable

我有2个IEnumerable集合.

IEnumerable<MyClass> objectsToExcept 
Run Code Online (Sandbox Code Playgroud)

IEnumerable<MyClass> allObjects.
Run Code Online (Sandbox Code Playgroud)

objectsToExcept可能包含来自的对象allObjects.

我需要从中删除allObjects对象objectsToExcept.例如:

foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Run Code Online (Sandbox Code Playgroud)

要么

allObject.Except(objectsToExcept)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.方法执行后的计数表示没有删除任何项目.

Jon*_*eet 58

我没有看到第一个版本如何编译,第二个版本将不会做任何事情,除非你使用结果.它不会从现有集合中删除任何东西-事实上,有可能甚至在内存中的集合支持它.它只返回一个序列,当迭代时,它将返回适当的值.

如果您正在使用结果,例如

IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

那么它应该是罚款,如果你覆盖GetHashCodeEquals 或者如果你乐于使用引用相等.您是否尝试删除逻辑上相等的值,或者两个序列中是否都出现相同的引用?有你重写GetHashCodeEquals,如果是的话,你肯定那些实施工作?

基本上它应该没问题 - 我建议你尝试创建一个简短但完整的程序来演示问题; 我怀疑这样做,你会发现什么是错的.


Tho*_*que 29

没有Remove方法IEnumerable<T>,因为它不是可修改的.

Except方法不会修改原始集合:它返回不包含排除项的新集合:

var notExcluded = allObjects.Except(objectsToExcept);
Run Code Online (Sandbox Code Playgroud)

ExceptMSDN上查看.

  • `Remove`作为Linq to XML空间中的扩展方法存在,但不执行OP尝试执行的操作.奇怪的是,你在文档页面上看到了`IEnumerable <T>`的成员,但它有一个限制`其中T:XNode`.从技术上讲,"Except"也不在"IEnumerable <T>"上,但这绝对太挑剔了. (4认同)

Mik*_*Two 16

删除和除外不要修改原始的IEnumerable.他们返回一个新的.尝试

var result = allObject.Except(objectsToexcept);
Run Code Online (Sandbox Code Playgroud)


lor*_*eto 5

虽然其他答案是正确的,但我必须补充一点,Except()调用的结果可以分配回原始变量。那是,

allObjects = allObjects.Except(objectsToExcept);
Run Code Online (Sandbox Code Playgroud)

还要记住,这Except()会产生两个集合的集差,所以如果要删除的变量有重复,它们都会被删除。