二变量排序算法

本文关键字:算法 排序 变量 | 更新日期: 2023-09-27 17:52:45

我正在寻找一种从西到东和从南到北排序位置点(经纬度)的算法。

排序时,点应从西、南开始排序。比较两点时,首先比较经度。数值越大(越向西)的点在列表中的位置越高。如果两点具有相同的经度(不太可能但可能),则比较两点的纬度。最低值(越靠南)在列表中位置越靠前

这个算法存在吗?也许在c#中?

ps-这些计算将仅限于美国大陆内的点。没有负纬度/经度值

二变量排序算法

using System.Linq;
var sortedPoints = points.OrderByDescending(p => p.Longitude).ThenBy(p => p.Latitude);

该算法在。net中并不存在(c#是一种语言,通常不实现算法,您通常会在。net基类库中找到它)。

但是,您可以轻松地创建具有Latitude/Longitude属性的Coordinates结构/类(我认为每个属性都是double),然后实现IComparable<T>

实现看起来像这样:

public class Coordinates : IComparable<Coordinates>
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public int CompareTo(Coordinates other)
    {
        // If the other instance is null, assume that
        // it is at 0,0?  You need to make that determination.
        if (other == null) return 1;
        // Compare longitude (double implements
        // IComparable<double>.
        int comparison = Longitude.CompareTo(other.Longitude);
        // If not 0, return the value.
        if (comparison <> 0) return comparison;
        // Compare latitude.  Inverse the result, as the more
        // south point (closer to 0) is greater.
        // Just return the value, if they are different, the
        // comparison value will be correct, if they are the
        // same, then comparison will be 0.
        return -Latitude.CompareTo(other.Latitude);
    }
}

现在,您可以填充这些实例,将它们放在一个数组中,并将其传递给Array类上的静态Sort方法。Sort方法将使用IComparable<T>实现对数组进行排序。

或者您可以将它们放在List<T>中(可能更容易,因为您可能事先不知道元素的数量),然后在实例上调用Sort方法;它也将使用IComparable<T>实现对自己进行排序。

你还提到两点是相同的。由于LatitudeLongitude被表示为double,因此存在浮点错误的风险。如果你想减少这些错误,你可以很容易地将属性更改为decimal(这保证了精度,直到某一点);这样,您将保证精度,并且它实现了IComparable<decimal>,这意味着IComparable<Coordinates>的实现将与开关一起工作。