title: Sorting ArrayList of shapes
body: <p>I have an ArrayList of MCommand objects (cmdList) and I want to sort it so that shapes with closest points are next to each other in the ArrayList. For example, say I have three lines in the ArrayList:
  line(xs, ys, zs, xe, ye, ze)</p>
  
  <p>cmdList[0] = line1(1.3, 2.5, 3, 4, 5, 6)</p>
  
  <p>cmdList[1] = line2(1, 5, 6.77, 7, 8, 2)</p>
  
  <p>cmdList[2] = line3(1, 6, 3, 1, 1.1, 1)</p>
  
  <p>Points that need to be close are LastPosition of line with BeginPosition of other line.
  LastPosition of line is (xe, ye, ze) and BeginPosition of line is (xs, ys, zs).
  I now do my sorting by executing a built in sorting:</p>
  
  <pre><code>cmdList.Sort(new MCommandComparer());
  </code></pre>
  
  <p>This is how my MCommand looks like and how i calculate distance of two points:</p>
  
  <pre><code>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));
      }
  }
  </code></pre>
  
  <p>This is the comparer i use:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>
  
  <p>I've tried many ways and got lost... This doesnt sort shapes the way I want to. My question is, what I could be doing wrong? Should i try writing sorting from scratch? My ArrayList can contain couple thousands elements, and i need to have an efficient sort.</p>