gpt4 book ai didi

c# - Linq 找到最长长度的一对点?

转载 作者:行者123 更新时间:2023-11-30 21:21:49 25 4
gpt4 key购买 nike

我有以下代码:

foreach (Tuple<Point, Point> pair in pointsCollection)
{
var points = new List<Point>()
{
pair.Value1,
pair.Value2
};

}

在此 foreach 中,我希望能够确定哪一对点在该对中每个点的坐标之间具有最重要的长度。

因此,假设点由以下对组成:

(1) var points = new List<Point>()
{
new Point(0,100),
new Point(100,100)
};

(2) var points = new List<Point>()
{
new Point(150,100),
new Point(200,100)
};

所以我有两组对,如上所述。他们都将绘制一条水平线。我很想知道找到它们之间距离最大的一对点的最佳方法是什么,无论是垂直的还是水平的。在上面的两个例子中,第一对点在 X 坐标之间有 100 的差异,因此这将是差异最大的点。但是,如果我有一组点对,其中一些点将绘制一条垂直线,一些点将绘制一条水平线,那么从垂直或水平差异的点集中检索该对的最佳方法是什么, 是集合中所有点中最大的吗?

谢谢!

克里斯

最佳答案

使用 OrderBy 根据您的条件创建排序,然后选择第一个。在这种情况下,按水平和垂直分量之间的最大绝对差值降序排列。

编辑:实际上,我认为您应该对元组本身执行此操作,对吗?我将努力使示例适应这一点。

首先,让我们为 Tuple<Point,Point> 添加一个扩展名计算它的长度。

 public static class TupleExtensions
{
public static double Length( this Tuple<Point,Point> tuple )
{
var first = tuple.Item1;
var second = tuple.Item2;
double deltaX = first.X - second.X;
double deltaY = first.y - second.Y;
return Math.Sqrt( deltaX * deltaX + deltaY * deltaY );
}
}

现在我们可以按长度对元组进行排序

var max = pointCollection.OrderByDescending( t => t.Length() )
.FirstOrDefault();

注意:仅迭代集合并跟踪最大值比使用 LINQ 排序/选择更快。

Tuple<Point,Point> max = null;
foreach (var tuple in pointCollection)
{
if (max == null || tuple.Length() > max.Length())
{
max = tuple;
}
}

显然,如果您在多个地方使用它,可以将其重构为 IEnumerable 扩展。

关于c# - Linq 找到最长长度的一对点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com