我正在编写一个函数,该函数计算与x和y坐标的距离。我有一个具有一堆x和y坐标的二维数组。 函数返回到点的距离顺序的x和y坐标列表。为了计算到每个点的距离,有一个公式(坐标和的平方根)。
我可以计算每个x和y坐标的距离。我将其添加到列表中。如何将距离存储为该特定坐标的另一个属性,然后对其进行排序。
public static List<List<int>> calculateDistance(int[,] Coordinates)
{
List<List<int>> result = new List<List<int>>();
int bound0 = Coordinates.GetUpperBound(0);
List<double> distance = new List<double>();
for (int i = 0;i <= bound0; i++)
{
distance.Add(Math.Sqrt(Coordinates[i, 0]) + Coordinates[i,1]));
}
return result;
}
}
答案 0 :(得分:1)
根据您的描述,您无需创建calculateDistance
方法。可以使用lambda表达式给出计算距离的公式。您可以在代码中的任何位置创建所需的列表,并使用Linq对其进行排序。
示例
var list = Enumerable
.Range(0, Coordinates.GetLength(0))
.Select(i => new { X = Coordinates[i, 0], Y = Coordinates[i, 1], D = Math.Sqrt(Math.Pow(Coordinates[i, 0], 2) + Math.Pow(Coordinates[i, 1], 2)) });
Math.Sqrt(Math.Pow(Coordinates[i, 0], 2) + Math.Pow(Coordinates[i, 1], 2))
在此处用于演示。而是使用您自己的表达式来计算距离。
要对此进行排序,您只需使用
var list2 = list.OrderBy(a => a.D);
答案 1 :(得分:0)
如果您尝试为输入和输出定义适当的数据结构,则将更有帮助。它可能是像元组一样简单的东西,也可能是结构或类之类的更惯用的东西。
struct Coordinate {
public Coordinate(int x, int y) {
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
然后定义一个结果结构,例如:
struct Result {
public Result(Coordinate coordinate, double distance) {
Coordinate = coordinate;
Distance = distance;
}
public Coordinate Coordinate { get; }
public double Distance { get; }
}
然后,您可以创建以下结果项的列表:
public List<Result> ComputeDistances(List<Coordinate> coordinates) {
List<Result> results = new List<Result>();
foreach (var coordinate in coordinates) {
double distance = Math.Sqrt(coordinate.X + coordinate.Y); // *
results.Add(new Result(coordinate, distance));
}
return results;
}
(*)请注意,指定的距离函数有些奇怪。通常,您希望对X和Y坐标的平方求和
如果您喜欢更具功能性的样式,则可以对代码进行大量更改:
public IEnumerable<Result> ComputeDistances(IEnumerable<Coordinate> coordinates) {
return from coordinate in coordinates
let distance = Math.Sqrt(coordinate.X + coordinate.Y)
select new Result(coordinate, distance);
}
从列表更改为IEnumerable可以让您谨慎处理,以延迟计算的执行。
获得结果序列后,对它们进行排序的最简单方法是使用OrderBy扩展方法。
public IEnumerable<Result> SortByDistance(IEnumerable<Result> results)
{
return results.OrderBy(result => result.Distance);
}
然后合并所有内容:
List<Coordinate> coordinates = .... // get the list of coordinates somehow;
IEnumerable<Result> distances = ComputeDistances(coordinates);
IEnumerable<Result> sortedByDistance = SortByDistance(distances);
// if you want to get back a list, in order to avoid enumerating multiple times
List<Result> results = sortedByDistance.ToList();