排序形状的ArrayList

时间:2010-07-08 14:10:27

标签: c# sorting coordinates distance shapes

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

cmdList [0] = line1(1.3,2.5,3,4,5,6)

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

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

需要关闭的点是与其他行的BeginPosition一致的LastPosition行。 行的LastPosition是(xe,ye,ze),行的BeginPosition是(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可以包含几千个元素,我需要有效的排序。

2 个答案:

答案 0 :(得分:1)

  

我可能做错了什么?

您假设元素将以特定顺序呈现给您 - 您正在记住“前一个”元素,这是一个巨大的红旗。

各种各样的工作方式根本不会这样做。基本上你的比较器应该是无状态的。听起来你在这里没有真正的总排序 - 没有办法取任何两个任意元素,并说明哪一个应该在另一个之前或之后。

我不知道你究竟是怎么做的,但我不认为.NET中内置的标准排序会对你有所帮助。

答案 1 :(得分:0)

您可以让您的MCommand类订阅IComparable。在执行此操作时,您将允许列表对形状进行排序,而无需其他Comparer Object。所有排序功能都将由列表及其中的对象处理。