0

I am absolute beginner with Linq. I have a for loop that I want to convert to Linq statement. This loop is basically performing a hit test on rectangles which are hitting an edge. It is excluding a rectangle.

private List<Rectangle> GetTouchingRects(List<Rectangle> rects, Edge edgeToCheck, Rectangle exclude)
{
    List<Rectangle> hittingRects = new List<Rectangle>();

    foreach (Rectangle rect in rects)
    {
        if (rect != exclude)
        {
            if (rect.Touch(edgeToCheck))
            {
                hittingRects.Add(rect);
            }
        }
    }

    return hittingRects;
}

I can write very basic Linq queries, but I have no idea on this one. I am mainly confused in how to check the exclusion check and how to perform the hit test.

Any help will be appreciated.

4

3 回答 3

9

你基本上只是过滤两次。您可以通过两个Where电话或一个电话来做到这一点:

return rects.Where(rect => rect != exclude)
            .Where(rect => rect.Touch(edgeToCheck))
            .ToList();

或者:

return rects.Where(rect => rect != exclude && rect.Touch(edgeToCheck))
            .ToList();

使用您认为更具可读性的任何一个。你可以把它写成一个查询表达式:

return (from rect in rects
        where rect != exclude && rect.Touch(edgeToCheck)
        select rect).ToList();

...但这对我来说似乎有点毫无意义。对 LINQ 中的这两种语法感到满意是值得的。

于 2013-06-13T20:40:12.037 回答
3

Jon 的解释很棒,但我也会说它Resharper是我第一次学习时的一个很好的工具LINQ

它有一个很酷的功能,可以让您将代码块转换为LINQ(如果它知道如何)。

对于您的情况,它看起来像这样:

在此处输入图像描述

输出看起来像 Jon 的第一个答案:

在此处输入图像描述

这会让你开始,但就像任何事情一样,练习会让你随着时间的推移变得更好。

于 2013-06-13T21:41:24.847 回答
0

我认为您可以通过这样做来跳过循环

hittingRects = rects.Where(ex => ex != exclude && ex.Touch(edgeToCheck)).ToList();
于 2013-06-13T20:40:26.753 回答