繁体   English   中英

从IEnumerable <T>中删除项目

[英]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)
{
    ...
}

如果你已经覆盖了GetHashCodeEquals 或者你很乐意使用引用相等,那么应该没问题。 您是否尝试删除逻辑上相等的值,或者两个序列中是否都出现相同的引用 你有没有覆盖GetHashCodeEquals ,如果有的话,你确定这些实现有效吗?

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM