我有两个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)));


我应该指出,您的原始代码可能会出现一些非常奇怪的行为。从内部循环中的列表中删除一个项目后,您将继续循环浏览具有相同索引touchingRectsi。这可能会导致一些意外的结果。某处可能应该有一个break,但为简洁起见,您可能已将其省略了。无论如何,使用此代码可以解决该问题。

关于c# - LINQ RemoveAll代替循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17098726/

10-13 07:47
查看更多