2016-01-18 77 views
14

Po prostu chcę utworzyć tablicę dwuwymiarowych tablic do przechowywania punktów współrzędnych.Tworzenie tablicy dwuwymiarowych tablic w C#

Tak więc chcę tablicy, w której każdy indeks zwraca dwuwymiarową tablicę, które będę używać jako x i y.

Oto co próbowałem:

waypoints = new int[4][,] { 
     {{0},{6, 0}}, 
     {{1},{1, 1}}, 
     {{2},{1, 5}}, 
     {{3},{6, 5}} 
    }; 

Zdaję sobie sprawę, to chyba wygląda głupio, ale Próbowałem szuka go w Google, a ja nie dostałem żadnych dobrych wyników.

To daje błąd:

"error CS0623: Array initializers can only be used in a variable or field initializer. Try using a new expression instead "

Próbowałem też robić to tak:

waypoints = new int[4][,] { 
     new int[,] {6, 0}, 
     new int[,] {1, 1}, 
     new int[,] {1, 5}, 
     new int[,] {6, 5} 
     }; 

To daje błąd:

"error CS0846: A nested array initializer was expected"

+0

Możliwa duplikatów [Pominięcie C# nowego z inicjowania poszarpanych macierzy] (http://stackoverflow.com/questions/14492279/omitting-c-sharp-new-z-jagged-array-initialization) – ardila

+1

Dlaczego nie utworzyć listy struktur 'Vector2' czy coś takiego? W dłuższej perspektywie może być łatwiej pracować i łatwiej. – rhughes

+1

@rhughes: Nie wspominając już o lepszej lokalizacji odniesienia (ważna uwaga dla pamięci podręcznych L-n w obecnych procesorach) i zmniejszonej zbieraniu śmieci (ponieważ * tablice * są obiektem, a struktury nie są). –

Odpowiedz

11

Jeszcze jeden nawias klamrowy ustawić {} jest wymagane w początkowej deklaracji:

var waypoints = new int[4][,] { 
    new int[,] {{6}, {0}}, 
    new int[,] {{1}, {1}}, 
    new int[,] {{1}, {5}}, 
    new int[,] {{6}, {5}} 
}; 

Dzieje się tak dlatego, że dla takich tablic 2D każdy element w tablicy jest uważany za tablicę do inicjalizacji (choć zwykle jest używany na element tablicy, taki jak val[0,0] = 4;).

Edit (po informacji zwrotnej od komentarzach):

Put w przeciwieństwie int[][] (znany jako jagged array, czyli: tablica tablic, których członkiem Tablica może być different size) int[,] jest 2D tablica z fixed dimension . Obie są tablicą, która przechowuje tablice, a zatem każdy element tablicy jest tablicą. To wyjaśnia, dlaczego istnieje potrzeba umieszczenia kolejnego nawiasu klamrowego w inicjalizacji, jak wyżej.

Takie 2d tablicy, gdy inicjowane inaczej spowoduje inny wymiar (a więc istnieje wiele sposobów, aby to zainicjować)

int[,] val = new int[,] { { 6 }, { 0 } }; //resulting in int[2,1] 
int[,] val = new int[,] { { 6, 0 } }; //resulting in int[1,2] 

W obu, dodatkowy zestaw nawiasu potrzebne.

różnic między jagged array i wielowymiarowej, ustalonej wielkości, tablicy, therealreadyplentygoodexplanations/benchmarkingavailableonline ze źródeł dobrze renomowanych. Rozumiem, że poza zainteresowaniem PO nie byłoby istotne, bym dodał więcej informacji na ten temat. (I w związku z tym zakres tej odpowiedzi jest pierwotnie skierowany tylko w celu odpowiedzi na nieudaną inicjalizację).

Rozumie się, że rozwiązanie nie jest najlepiej wykorzystywane do przechowywania punktów współrzędnych (jak to robi OP). Powyższe wyjaśnienie podaje wyjaśnienie, dlaczego jego inicjalizacja nie działa, zamiast zapewniać najlepsze rozwiązanie do przechowywania punktów współrzędnych. Jeśli chodzi o przechowywanie punktów współrzędnych, Point w System.Drawingstruct będzie bardziej odpowiedni (jak sugerowano w komentarzu).

Użycie tablicy 2D do reprezentowania pojedynczego punktu w 2D Cartesian coordinate jest "przeskokiem", ponieważ tablica 1D jest już w stanie przechowywać tyle cyfr, ile pozwala na to komputer, o wiele więcej niż dwie liczby wymagane do przechowywania punktów w kartezjańskim system współrzędnych.

+0

Dzięki! Jeśli mógłbyś wyjaśnić, dlaczego tak jest, byłbym szczęśliwy :) – MysticPing

+0

Wierzę, że jest to najlepiej wyjaśnione przez Microsoft w MSDN: https://social.msdn.microsoft.com/Forums/en-US/283a69b0-169f-4178- 88ce-1b71079897a2/differe-between-simple-array-and-jagged-array? Forum = csharplanguage PS: ale jeśli chcesz zapisać punkt, warto zapisać go używając 'Point'' class' – Ian

+0

Wierzę, że' new int [,] {{6,0}} 'wystarczyłoby i byłoby prawdopodobnie bardziej czytelne. – ardila

12

Istnieje prosta odpowiedź na to pytanie. Użyj instancji klasy "System.Drawing.Point". Utwórz tablicę "Punkt" do przechowywania współrzędnych. Aby utworzyć tablicę:

Point[] points = new Point[4]; 

Aby przypisać wartość do tablicy (np. W pozycji 0), użyj następującego kodu.

points[0] = new Point(xvalue,yvalue);//Where "xvalue" and "yvalue" are integer variables. 

Aby uzyskać wartości X i Y z instancji klasy punktowej. Użyj poniższego kodu.

int xvalue = points[0].X; 

int yvalue = points[0].Y; 

P.S. Można korzystać z tych punktów, aby przypisać lokalizacje do kontroli, ale to już inna historia^_^

+1

Dzięki, źle to sprawdź! – MysticPing

2

Macierze są dwuwymiarowe i mają nieznane wielkości, inicjator może definiować tablic o różnych rozmiarach:

 var waypoints = new int[4][,] { 
       new int[,] { {1, 2, 6}, {3, 4, 5} }, // two rows, 3 columns 
       new int[,] { {1, 1}, {1, 2} } , // 2 x 2 
       new int[,] { {1, 5} }, // 1 x 2 
       new int[,] { {6, 5} } 
       };