Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何比较LINQ中的每个元素?_C#_Linq - Fatal编程技术网

C# 如何比较LINQ中的每个元素?

C# 如何比较LINQ中的每个元素?,c#,linq,C#,Linq,问题是,对于一个IEnumerable矩形,我需要知道每个矩形是否与其他矩形相交。因此,输出将是一个具有相同计数的序列,每个矩形包含一个布尔值 所以这是一种嵌套循环问题,但它不应该将元素与自身进行比较,如果recta与rectb相交,则无需再次检查rectb 这对LINQ有可能吗 //for every rectangle in your list. //search the list, eliminating the same one, //and find if any of the o

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

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

这对LINQ有可能吗

//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,以及关于是否与任何其他IEnumerable相交的状态,请切换到使用Select(),如下所示

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

交叉点的标准是什么?
矩形列表。其中(r=>r!=[specifyRectangle])。选择(r=>intersectionConditions)
但是,如果已经找到,这仍然会计算重复项。@austinwernli听起来thalm想减少检查次数,例如,只检查[A和B]和[B和A]中的一个。你的小片段将检查每个矩形,这是工作的两倍。是的,我现在明白了。正在抛出一个基本实现:)元素是否具有某种id?如果是这样的话,您可以检查a.id>b.id是否符合我对代码的理解,这将输出所有相交的矩形,但我要寻找的是一个布尔值序列,其计数与矩形相同。但是我想这是可能的,用一个选择来替换第一个,右边的@ Talm见第二个例子。是的,这是尽可能接近的,它不考虑对AB和BA的双重检查,但是它很简单,只要找到一个真正的值就可以停止。这对我来说已经足够好了。谢谢