Z grubsza potrzebuję osiągnąć następującą rzecz:
- Stwórz tablicę obiektów typu
Point
oraz zainicjalizuj ją jakimiś danymi (w poniższym kodzie nazwa tablicycentroid
). - Stwórz drugą tablicę tego samego typu (
oldCentroid
). - Do tablicy
oldCentroid
przypisz kopię tablicycentroid
- Zmień wartości tablicy
centroid
- Jeśli tablice
centroid
ioldCentroid
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;
}