按最近距离对列表排序

时间:2015-11-28 21:46:41

标签: c# linq sorting

我正在处理一个小应用程序。当我添加新目的地时,我想按照彼此最近的位置重新排列我的列表。

使用CalcDistance方法,我可以计算当前位置和下一个位置之间的距离。

但是我一直在排序我的名单。有什么想法吗?

public class Transportcar
{
    public Destinations Start { get; set; }
    public Destinations End { get; set; }
    public int Deliveries { get; set; }

    List<Destinations> _destinations;

    public Transportcar()
    {
        _destinations = new List<Destinations>();

    }


    public void AddDestination(Destinations destination)
    {
        _destinations.Add(destination);
    }

    public IEnumerable<Destinations> Destinations {
        get {
            return _destinations.AsEnumerable();
        }
    }

    public double CalcDistance(Destinations Start, Destinations End)
    {
        //een ouwe man zei ooit: c^2 = a^2 + b^2 
        return Math.Sqrt(Math.Pow(Math.Abs(Start.X - End.X), 2) + Math.Pow(Math.Abs(Start.Y - End.Y), 2));
    }
}

public class Sendings     
{
    public List<Destinations> DestinationsTodo = new List<Destinations>();

    public void SortList()
    {
        DestinationsTodo = DestinationsTodo.OrderBy(x => x.X).ThenBy(x => x.Y).ToList();
    }

    }
}

1 个答案:

答案 0 :(得分:0)

在您的情况下,我完全建议使用SortedList课程,但如果您确定使用List,则可以从destination中减去所有deliver点,然后对它进行排序。

List<Point> sub = new List<Point>();
_destinations.ForEach(item => sub.Add(new Point(item.X - deliver.X, item.Y - deliver.Y)));

sub.Sort((a, b) =>
{
    double d1 = Math.Pow(a.X, 2) + Math.Pow(a.Y, 2);
    double d2 = Math.Pow(b.X, 2) + Math.Pow(b.Y, 2);
    return d1.CompareTo(d2);
});

List<Point> sorted = new List<Point>();
sub.ForEach(item => sorted.Add(new Point(item.X + deliver.X, item.Y + deliver.Y)));

最后,sorted列表就是您想要的。