Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 形状排序数组列表_C#_Sorting_Coordinates_Distance_Shapes - Fatal编程技术网

C# 形状排序数组列表

C# 形状排序数组列表,c#,sorting,coordinates,distance,shapes,C#,Sorting,Coordinates,Distance,Shapes,我有一个MCommand对象(cmdList)的ArrayList,我想对它进行排序,以便在ArrayList中具有最近点的形状彼此相邻。例如,假设ArrayList中有三行: 行(xs、ys、zs、xe、ye、ze) cmdList[0]=第1行(1.3、2.5、3、4、5、6) cmdList[1]=第2行(1,5,6.77,7,8,2) cmdList[2]=第3行(1,6,3,1,1.1,1) 需要闭合的点是线的最后位置和另一条线的起始位置。 测线的最后位置为(xe,ye,ze),测线的

我有一个MCommand对象(cmdList)的ArrayList,我想对它进行排序,以便在ArrayList中具有最近点的形状彼此相邻。例如,假设ArrayList中有三行: 行(xs、ys、zs、xe、ye、ze)

cmdList[0]=第1行(1.3、2.5、3、4、5、6)

cmdList[1]=第2行(1,5,6.77,7,8,2)

cmdList[2]=第3行(1,6,3,1,1.1,1)

需要闭合的点是线的最后位置和另一条线的起始位置。 测线的最后位置为(xe,ye,ze),测线的起始位置为(xs,ys,zs)。 现在,我通过执行内置排序来进行排序:

cmdList.Sort(new MCommandComparer());
这是我的MCommand的外观,也是我计算两点距离的方式:

public abstract class MCommand
{
    //...
    public abstract Point3 LastPosition { get; }
    public abstract Point3 BeginPosition { get; }

    public double CompareTo(Object obj)
    {
        Point3 p1, p2;
        p1 = this.BeginPosition;
        p2 = ((MCommand)obj).LastPosition;
        return Math.Sqrt(Math.Pow((p2.x - p1.x), 2) +
                     Math.Pow((p2.y - p1.y), 2) +
                     Math.Pow((p2.z - p1.z), 2));
    }
}
这是我使用的比较器:

public class MCommandComparer : IComparer
{
    private MCommand prev;
    double distanceFromPrev = 0;
    double distanceFromCurr = 0;
    public int Compare(object o1, object o2)
    {
        if ((MCommand)o2 == prev)
            return 0;
        if (prev != null)
            distanceFromPrev = ((MCommand)o1).CompareTo(prev);
        distanceFromCurr = ((MCommand)o1).CompareTo(o2);
        prev = (MCommand)o2;
        return (int)(distanceFromCurr - distanceFromPrev);
    }
}
我试过很多方法,但都迷路了。。。这不是我想要的排序方式。我的问题是,我可能做错了什么?我应该从头开始写排序吗?我的ArrayList可以包含数千个元素,我需要一个有效的排序

我可能做错了什么

您假设元素将以特定的顺序呈现给您—您记住了“上一个”元素,这是一个巨大的红旗

各种各样的工作方式根本不能做到这一点。基本上,比较器应该是无状态的。听起来这里并没有一个完整的排序——没有任何方法可以任意选取两个元素,并指出哪一个应该在另一个元素之前或之后


我不知道您需要怎么做,但我认为.NET中内置的标准排序不会对您有多大帮助。

您可以让您的MCommand类订阅IComparable。在此过程中,您将允许列表对形状进行排序,而不需要额外的比较器对象。所有排序功能都将由列表和其中的对象处理