Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从IEnumerable中删除项目<;T>;_C#_Linq_Ienumerable - Fatal编程技术网

C# 从IEnumerable中删除项目<;T>;

C# 从IEnumerable中删除项目<;T>;,c#,linq,ienumerable,C#,Linq,Ienumerable,我有两本数不清的书 IEnumerable<MyClass> objectsToExcept 或 但它不起作用。方法执行后的计数表明没有删除任何项。我看不出第一个版本将如何编译,第二个版本将不会执行任何操作,除非使用结果。它不会从现有集合中删除任何内容—实际上,甚至可能没有内存中的集合支持它。它只返回一个序列,当对该序列进行迭代时,它将返回适当的值 如果您正在使用结果,例如 IEnumerable<MyClass> others = allObjects.Except

我有两本数不清的书

IEnumerable<MyClass> objectsToExcept 


但它不起作用。方法执行后的计数表明没有删除任何项。

我看不出第一个版本将如何编译,第二个版本将不会执行任何操作,除非使用结果。它不会从现有集合中删除任何内容—实际上,甚至可能没有内存中的集合支持它。它只返回一个序列,当对该序列进行迭代时,它将返回适当的值

如果您正在使用结果,例如

IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
    ...
}
IEnumerable others=allObjects.Except(objectsToExcept);
foreach(其他类别中的MyClass x)
{
...
}
如果您已经覆盖了
GetHashCode
Equals
或者您愿意使用引用相等,那么就可以了。您是要删除逻辑上相等的值,还是在两个序列中出现相同的引用?您是否覆盖了
GetHashCode
Equals
,如果是,您确定这些实现可以工作吗


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

删除并除此之外不要修改原始IEnumerable。他们返回一个新的。试一试

var result = allObject.Except(objectsToexcept);

IEnumerable
上没有
Remove
方法,因为它不可修改

Except
方法不修改原始集合:它返回不包含排除项的新集合:

var notExcluded = allObjects.Except(objectsToExcept);

请参见上的
Except

虽然其他答案正确,但我必须补充一点,即
Except()
调用的结果可以分配回原始变量。就是

allObjects = allObjects.Except(objectsToExcept);

还要记住,
Except()
将产生两个集合的集合差异,因此如果要删除的变量重复,它们都将被删除。

Remove
作为扩展方法存在于Linq-to-XML空间中,但不执行OP试图执行的操作。奇怪的是,您在
IEnumerable
成员的文档页面上看到了它,但它有一个限制
,其中T:XNode
。从技术上讲,
除了
也不在
IEnumerable
上,但那绝对是太挑剔了。@Mike Two,事实上,我从来没有注意到。。。它看起来像是文档中的一个bug,只有当源代码没有被键入到某个东西时。列表。如果未枚举,则无法将Exception分配回列表。
var result = allObject.Except(objectsToexcept);
var notExcluded = allObjects.Except(objectsToExcept);
allObjects = allObjects.Except(objectsToExcept);