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);