[英]Calculate the distance for each x and y coordinate
我正在寫一個函數來計算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;
}
}
根據您的描述,您無需創建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);
如果您嘗試為輸入和輸出定義適當的數據結構,則將更有幫助。 它可能像元組一樣簡單,也可能是結構或類之類的更慣用的東西。
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.