[英]Remove items from 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
,如果有的话,你确定这些实现有效吗?
基本上它应该没问题 - 我建议你尝试创建一个简短但完整的程序来演示问题; 我怀疑这样做,你会发现什么是错的。
IEnumerable<T>
上没有Remove
方法,因为它不是可修改的。
Except
方法不会修改原始集合:它返回一个不包含排除项的新集合:
var notExcluded = allObjects.Except(objectsToExcept);
请参阅MSDN上的“ Except
”。
删除和除外不要修改原始的IEnumerable。 他们返回一个新的。 尝试
var result = allObject.Except(objectsToexcept);
虽然其他答案是正确的,但我必须补充说,可以将Except()
调用的结果分配回原始变量。 那是,
allObjects = allObjects.Except(objectsToExcept);
还要记住, Except()
将产生两个集合的集合差异,因此如果要删除的变量重复,则将全部删除它们。
others.Where(contract => !objectsToExcept.Any()).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.