如何在LINQ中比较每个元素?

时间:2015-07-10 15:51:06

标签: c# linq

问题是,对于IEnumerable的矩形,我需要知道每个矩形是否与任何其他矩形相交。因此输出将是一个具有相同计数的序列,每个矩形包含一个布尔值。

所以它是一种嵌套循环问题,但它不应该将元素与自身进行比较,如果rect A与rect B相交,则无需再次检查rect B.

LINQ可以实现吗?

1 个答案:

答案 0 :(得分:2)

//for every rectangle in your list. 
//search the list, eliminating the same one, 
//and find if any of the others intersect with it.
var intersectingRectangles = rectangles
  .Where(rect => rectangles
                 .Where(r => r != rect)
                 .Any(r => DoIntersect(rect, r)));

这假设你有一个函数DoIntersect采用两个矩形并告诉你它们是否相交。

如果它不足以满足您的需求,可以对此进行许多改进。您可以根据坐标进行排序,并能够消除大量的比较。但是,这一切都取决于您的数据是什么样的以及需要多快的速度。

如果你想让输出包含每个原始的IEnumerable以及是否与其他任何人相交的状态,而不是切换到使用如下的Select()。

var allWithIntersectionStatus = rectangles.Select(rect => new
{
    Value = rect,
    DoesIntersect = rectangles
        .Where(rectWhere => rectWhere != rect)
        .Any(rectAnt => DoIntersect(rect, rectAnt))
});
相关问题