从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) { ... }
那么如果你重写了GetHashCode
和Equals
或者如果你很乐意使用引用相等,那应该没问题。 你是否试图去除逻辑上相等的值,或者是否在这两个序列中出现相同的引用 ? 你有没有重写GetHashCode
和Equals
,如果是的话,你确定这些实现工作?
基本上它应该是好的 – 我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();