Porównanie tablic obiektów

0

Z grubsza potrzebuję osiągnąć następującą rzecz:

  1. Stwórz tablicę obiektów typu Point oraz zainicjalizuj ją jakimiś danymi (w poniższym kodzie nazwa tablicy centroid).
  2. Stwórz drugą tablicę tego samego typu (oldCentroid).
  3. Do tablicy oldCentroid przypisz kopię tablicy centroid
  4. Zmień wartości tablicy centroid
  5. Jeśli tablice centroid i oldCentroid nie są takie same wróć do kroku 3

Poniższy kod zapętla się w pętli do while, natomiast pętla w tym wypadku powinna wykonać się tylko raz.
Dlaczego tak się dzieje? Jak poprawnie porównać wartości obu obiektów? Metodę DeepClone wziąłem z neta, więc zakładam, że kopiowanie jest dobrze zrobione.

Kod

    [Serializable] 
    class Point
    {
        public double X { get; set; }
        public double Y { get; set; }
        public int Group { get; set; }
    }
        static void Main(string[] args)
        {
            Point[] centroid = new Point[3];
            Init(centroid);

            Point[] oldCentroid = new Point[3];
            int iterator = 0;
            do
            {
                iterator++;
                Console.WriteLine(iterator);

                oldCentroid = (Point[])DeepClone(centroid);
                centroid = MoveCentroids(centroid);
            } while (!oldCentroid.Equals(centroid));

            //inny warunek, który też nie działa
            //} while (oldCentroid.Except(centroid).Count() != 0);

            Console.ReadLine();
        }

        public static Point[] MoveCentroids(Point[] centroid)
        {
            //tutaj przypisuje jakieś nowe wartości do obiektu centroid

            return centroid;
        }

        public static object DeepClone(object obj)
        {
            object objResult = null;
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, obj);

                ms.Position = 0;
                objResult = bf.Deserialize(ms);
            }
            return objResult;
        }

        public static void Init(Point[] centroid)
        {
            Point p11 = new Point();
            p11.X = 0;
            p11.Y = 1;
            p11.Group = 0;
            centroid[0] = p11;

            Point p12 = new Point();
            p12.X = 2;
            p12.Y = -1;
            p12.Group = 1;
            centroid[1] = p12;

            Point p13 = new Point();
            p13.X = 5;
            p13.Y = -2;
            p13.Group = 2;
            centroid[2] = p13;
        }
0

Co do Equals:

If the current instance is a reference type, the Equals(Object) method tests for reference equality, and a call to the Equals(Object) method is equivalent to a call to the ReferenceEquals method.

Użyj:
Enumerable.SequenceEquals()

0

próbowałem na wiele sposobów porównywać, między innymi używając metody SequenceEquals() - rezultat ten sam

0

A przy używaniu SequenceEquals przekazywałeś swój własny komparator czy może nie podając nic korzystałeś domyślnego Equals, które jak już wiadomo porównuje referencje?

0

co to jest komparator?
porównywałem tak while (!oldCentroid.SequenceEqual(centroid));

1

https://msdn.microsoft.com/en-us/library/bb342073(v=vs.100).aspx

Albo w tej swojej klasie Point zaimplementuje interfejs IEquatable<Point>.

1 użytkowników online, w tym zalogowanych: 0, gości: 1