我有两个for循环,用于从列表中删除项目。我正在为这些循环寻找等效的LINQ语句
for (Int32 i = points.Count - 1; i >= 0; i--)
{
for (Int32 j = touchingRects.Count - 1; j >= 0; j--)
{
if (touchingRects[j].HitTest(points[i], rect.TopEdge.Y1))
{
points.RemoveAt(i);
}
}
}
到目前为止,我能够做到这一点,但是编译器无法理解以下代码:
points.RemoveAll(p => touchingRects.Where(r => r.HitTest(p, r.TopEdge.Y1)));
任何帮助将不胜感激。
最佳答案
您传递给RemoveAll
的委托需要返回布尔值。
我认为您该怎么做:
points.RemoveAll(p => touchingRects.Any(r => r.HitTest(p, r.TopEdge.Y1)));
或者可能是这样(如果变量
rect
实际上是在其他地方定义的):points.RemoveAll(p => touchingRects.Any(r => r.HitTest(p, rect.TopEdge.Y1)));
我应该指出,您的原始代码可能会出现一些非常奇怪的行为。从内部循环中的列表中删除一个项目后,您将继续循环浏览具有相同索引
touchingRects
的i
。这可能会导致一些意外的结果。某处可能应该有一个break
,但为简洁起见,您可能已将其省略了。无论如何,使用此代码可以解决该问题。关于c# - LINQ RemoveAll代替循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17098726/