Алгоритм сортировки двух переменных - PullRequest
1 голос
/ 25 апреля 2011

Я ищу алгоритм сортировки точек местоположения (широта и долгота) с запада на восток и с юга на север.

При сортировке точки должны сортироваться, начиная с запада и юга. Когда сравниваются две точки, долгота сравнивается первой. Чем больше значение (больше запад), тем выше в списке. Если две точки имеют одинаковую долготу, маловероятную, но возможную, сравниваются широты двух точек. Наименьшее значение (больше юга) находится выше в списке.

Существует ли этот алгоритм где-нибудь? Может быть в C #?

ps- эти расчеты будут ограничены точками в пределах континентальной части США. Не будет отрицательных значений широты / долготы.

Ответы [ 2 ]

6 голосов
/ 25 апреля 2011
using System.Linq;

var sortedPoints = points.OrderByDescending(p => p.Longitude).ThenBy(p => p.Latitude);
3 голосов
/ 27 апреля 2011

Алгоритм не существует "из коробки" в .NET (C # является языком и обычно не реализует алгоритмы, его обычно можно найти в библиотеке базовых классов .NET).

Тем не менее, вы можете легко создать Coordinates структуру / класс со свойствами Latitude / Longitude (каждое как 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);
    }
}

Теперь вы можете заполнить их экземпляры, поместить их в массив и передать его методу static Sort вArray класс .Метод Sort будет использовать реализацию IComparable<T> для сортировки массива.

Или вы можете поместить их в List<T> (возможно, проще, поскольку вы можете заранее не знать количество элементов), а затемвызовите Sort метод в экземпляре;он также будет использовать реализацию IComparable<T> для сортировки.

Вы также упомянули две одинаковые точки.Поскольку Latitude и Longitude представлены как double, вы рискуете получить ошибки с плавающей запятой.Если вы хотите уменьшить эти ошибки, вы можете легко изменить свойство на decimal (что гарантирует точность до определенной точки);таким образом, вы гарантируете точность, и она реализует IComparable<decimal>, что означает, что реализация IComparable<Coordinates> будет просто работать с коммутатором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...