从IEnumerable <T>中删除项目

我有2个IEnumerable集合。

IEnumerable<MyClass> objectsToExcept 

 IEnumerable<MyClass> allObjects. 

objectsToExcept可能包含来自allObjects对象。

我需要从allObjects对象中objectsToExcept 。 例如:

 foreach (var myClass in objectsToExcept) { allObjects.Remove(myClass); } 

要么

 allObject.Except(objectsToExcept) 

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

我不明白第一个版本是如何编译的,除非你使用结果,否则第二个版本将不会执行任何操作。 它不会从现有的集合中删除任何东西 – 事实上,甚至可能没有支持它的内存集合。 它只是返回一个序列,当迭代时,将返回适当的值。

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

 IEnumerable<MyClass> others = allObjects.Except(objectsToExcept); foreach (MyClass x in others) { ... } 

那么如果你重写了GetHashCodeEquals 或者如果你很乐意使用引用相等,那应该没问题。 你是否试图去除逻辑上相等的值,或者是否在这两个序列中出现相同的引用 ? 你有没有重写GetHashCodeEquals ,如果是的话,你确定这些实现工作?

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

IEnumerable<T>上没有Remove方法,因为它不能被修改。

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

 var notExcluded = allObjects.Except(objectsToExcept); 

请参阅MSDN上的 Except

删除和除了不修改原来的IEnumerable。 他们返回一个新的。 尝试

 var result = allObject.Except(objectsToexcept); 

而其他答案是正确的,我不得不补充说, Except()调用的结果可以分配回原始variables。 那是,

 allObjects = allObjects.Except(objectsToExcept); 

另外请记住, Except()会产生两个集合的集合差异,所以如果有重复的variables被删除,它们都将被删除。

 others.Where(contract => !objectsToExcept.Any()).ToList();