【发布时间】:2013-06-24 23:38:45
【问题描述】:
(我已经根据“removeall where”或“removeall two argument predicate”的关键字进行了尽可能多的搜索,但运气不佳,所以这里是这样)
问题是我有一个对象列表(类 Wave)和一个关系函数: private bool AinB(Wave A, Wave B),如果 A '在' B 中,则返回 true。AinB(x,y) 为 true 保证 AinB(y,x) 为 false。
删除列表中对象“位于”列表中另一个对象中的所有对象的最佳方法是什么?即,在删除之后,列表应该只包含与列表中的任何其他对象都不存在“存在”关系的对象?
理想情况下,这可以轻松完成
listX.RemoveAll( (x,y) => AinB(x,y)) 但当然这在 C# 中是不合法的,也没有简单的方法来指定要删除哪个,x 或 y。
我想过用索引循环遍历列表
int i = listX.Count - 1;
while (i>=0)
{
int r = listX.RemoveAll(X => AinB(X, listX[i]));
i = i - r - 1;
}
这似乎可行,但我想知道是否有更好的方法使用直接 linq 代码来解决问题。 谢谢。
【问题讨论】:
-
听上去你正在建造一棵树,这是正确的吗?我在回答中假设 AinB 正在检查树的节点并确定
A是否是B的子节点。 -
不,它相当复杂,而且这个“过滤器”只是“关系”之一,但却是过滤掉大部分对象的主要关系。