Max*_*xim 45 c# linq ienumerable
我有2个IEnumerable集合.
IEnumerable<MyClass> objectsToExcept
Run Code Online (Sandbox Code Playgroud)
和
IEnumerable<MyClass> allObjects.
Run Code Online (Sandbox Code Playgroud)
objectsToExcept可能包含来自的对象allObjects.
我需要从中删除allObjects对象objectsToExcept.例如:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Run Code Online (Sandbox Code Playgroud)
要么
allObject.Except(objectsToExcept)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.方法执行后的计数表示没有删除任何项目.
Jon*_*eet 58
我没有看到第一个版本如何编译,第二个版本将不会做任何事情,除非你使用结果.它不会从现有集合中删除任何东西-事实上,有可能甚至是在内存中的集合支持它.它只返回一个序列,当迭代时,它将返回适当的值.
如果您正在使用结果,例如
IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
...
}
Run Code Online (Sandbox Code Playgroud)
那么它应该是罚款,如果你覆盖GetHashCode和Equals 或者如果你乐于使用引用相等.您是否尝试删除逻辑上相等的值,或者两个序列中是否都出现相同的引用?有你重写GetHashCode和Equals,如果是的话,你肯定那些实施工作?
基本上它应该没问题 - 我建议你尝试创建一个简短但完整的程序来演示问题; 我怀疑这样做,你会发现什么是错的.
Tho*_*que 29
没有Remove方法IEnumerable<T>,因为它不是可修改的.
该Except方法不会修改原始集合:它返回不包含排除项的新集合:
var notExcluded = allObjects.Except(objectsToExcept);
Run Code Online (Sandbox Code Playgroud)
Except在MSDN上查看.
Mik*_*Two 16
删除和除外不要修改原始的IEnumerable.他们返回一个新的.尝试
var result = allObject.Except(objectsToexcept);
Run Code Online (Sandbox Code Playgroud)
虽然其他答案是正确的,但我必须补充一点,Except()调用的结果可以分配回原始变量。那是,
allObjects = allObjects.Except(objectsToExcept);
Run Code Online (Sandbox Code Playgroud)
还要记住,这Except()会产生两个集合的集差,所以如果要删除的变量有重复,它们都会被删除。
| 归档时间: |
|
| 查看次数: |
83401 次 |
| 最近记录: |