我有2个IEnumerable系列。
IEnumerable<MyClass> objectsToExcept
和
IEnumerable<MyClass> allObjects.
objectsToExcept
可能包含来自allObjects
的对象。
我需要从allObjects
中的objectsToExcept
个对象中删除。例如:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
或者
allObject.Except(objectsToExcept)
但它不起作用。方法执行后的计数表示没有项目被删除。
答案 0 :(得分:58)
我看不到第一个版本是如何编译的,第二个版本除了使用结果之外不会做任何事情。它不会从现有集合中删除任何内容 - 事实上,甚至可能 内存集合支持它。它只返回一个序列,当迭代时,它将返回适当的值。
如果 使用结果,例如
IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
...
}
那么如果 你已经覆盖了GetHashCode
和Equals
或,如果您乐意使用引用相等,那么它应该没问题。您是尝试删除逻辑上相等的值,还是在两个序列中都发生相同的引用?您是否覆盖了GetHashCode
和Equals
,如果是,您确定这些实施是否有效?
基本上它应该没问题 - 我建议你尝试创建一个简短而完整的程序来演示问题;我怀疑这样做,你会发现什么是错的。
答案 1 :(得分:29)
Remove
上没有IEnumerable<T>
方法,因为它无法修改。
Except
方法不会修改原始集合:它返回一个不包含排除项的新集合:
var notExcluded = allObjects.Except(objectsToExcept);
请参阅MSDN上的Except
。
答案 2 :(得分:16)
删除并且不要修改原始的IEnumerable。他们返回一个新的。尝试
var result = allObject.Except(objectsToexcept);
答案 3 :(得分:4)
虽然其他答案都是正确的,但我必须补充一点,Except()
调用的结果可以分配回原始变量。也就是说,
allObjects = allObjects.Except(objectsToExcept);
另请注意,Except()
将产生两个集合的集合差异,因此如果要删除的变量重复,则将全部删除。
答案 4 :(得分:0)
others.Where(contract => !objectsToExcept.Any()).ToList();