从IEnumerable <t> </t>中删除项目

时间:2010-07-06 12:01:26

标签: c# linq ienumerable

我有2个IEnumerable系列。

IEnumerable<MyClass> objectsToExcept 

IEnumerable<MyClass> allObjects.

objectsToExcept可能包含来自allObjects的对象。

我需要从allObjects中的objectsToExcept个对象中删除。例如:

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

或者

allObject.Except(objectsToExcept)

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

5 个答案:

答案 0 :(得分:58)

我看不到第一个版本是如何编译的,第二个版本除了使用结果之外不会做任何事情。它不会从现有集合中删除任何内容 - 事实上,甚至可能 内存集合支持它。它只返回一个序列,当迭代时,它将返回适当的值。

如果 使用结果,例如

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

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

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

答案 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();