فرز قائمة نقاط ثنائية الأبعاد (أولاً بواسطة x ثم y)

StackOverflow https://stackoverflow.com/questions/2794547

سؤال

أحاول فرز قائمة بنقاط ثنائية الأبعاد أولاً بواسطة X-co-co-co-co-coDinate. لقد قمت بتطبيق واجهة icomparer على النحو التالي:

class PointComparer : IComparer<Point>
{
    public int Compare(Point x, Point y)
    {
        if (x.Y != y.Y)
        {
            return x.Y - y.Y;
        }
        else
        {
            return x.X - y.X;
        }

    }
}

ثم اتصل بالفرز على النحو التالي:

pointsList.Sort(new PointComparer());

لسبب ما ، لا تُحدد القائمة. بالتأكيد شيء بسيط للغاية وسخيف ، لكنه عالق في هذا لفترة طويلة .... TIA

هل كانت مفيدة؟

المحلول

هذا يجب أن يعمل بشكل أفضل:

class PointComparer : IComparer<Point>
{
  public int Compare(Point first, Point second)
  {
    if (first.X == second.X)
    {
        return first.Y - second.Y;
    }
    else
    {
        return first.X - second.X;
    }

  }
}

إذا كانت قيم X مختلفة ، فستستخدم قيمة Y للفرز. هذا يختلف عن الكود الخاص بك ، حيث سيتم استخدام قيم X إذا كانت قيم Y هي نفسها.

كما ذكر الآخرون ، إذا كان بإمكانك استخدام LINQ ، فيجب عليك استخدام OrderBy و ThenBy طرق التمديد:

pointsList.OrderBy(p => p.X).ThenBy(p => p.y)

نصائح أخرى

ألا يمكنك استخدام Orderby -> Thenby؟

http://msdn.microsoft.com/en-us/library/bb534743.aspx

لما لا:

var sorted = pointsList.OrderBy(p => p.X)
                       .ThenBy(p => p.y)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top