Tablica wielowymiarowa [] [] vs [,] [duplikat]

to pytanie ma już odpowiedzi tutaj : Jakie są różnice między wielowymiarową tablicą a tablicą tablic w C#? (9 odpowiedzi) Zamknięty 7 lat temu .
double[][] ServicePoint = new double[10][9]; // <-- gives an error (1)
double[,] ServicePoint = new double[10,9]; // <-- ok (2)

Jaka jest ich różnica? (1) jaki jest powód błędu?

I

double d = new double[9]
ServicePoint[0] = d;

Za pomocą (2) wyświetli monit o błąd. Dlaczego?

Author: Ronny Brendel, 2012-09-24

5 answers

Jeden jest tablicą tablic, a drugi jest tablicą 2d. Pierwszy może być postrzępiony, drugi jest jednolity.

Czyli double[][] może być:

double[][] x = new double[5][];

x[0] = new double[10];
x[1] = new double[5];
x[2] = new double[3];
x[3] = new double[100];
x[4] = new double[1];

Ponieważ każdy wpis w tablicy jest odniesieniem do tablicy double. Z postrzępioną tablicą możesz wykonać przypisanie do tablicy tak, jak chcesz w drugim przykładzie:

x[0] = new double[13];

Na drugim elemencie, ponieważ jest to jednolita tablica 2d, nie możesz przypisać tablicy 1d do wiersza lub kolumny, ponieważ musisz indeksować zarówno wiersz, jak i kolumna, która sprowadza cię do jednego double:

double[,] ServicePoint = new double[10,9];

ServicePoint[0]... // <-- meaningless, a 2d array can't use just one index.

UPDATE :

Aby wyjaśnić na podstawie Twojego pytania, powodem, dla którego twój #1 miał błąd składni, jest to, że miałeś to:

double[][] ServicePoint = new double[10][9];

I nie można określić drugiego indeksu w momencie budowy. Kluczem Jest to, że ServicePoint jest Nie tablicą 2d, ale tablicą 1D (tablic) i dlatego ponieważ tworzysz tablicę 1D (tablic), podajesz tylko jeden indeks:

double[][] ServicePoint = new double[10][];

Wtedy, gdy tworzysz każda pozycja w tablicy, każda z nich jest również tablicami, więc wtedy można określić ich wymiary (które mogą być różne, stąd określenie jagged array):

ServicePoint[0] = new double[13];
ServicePoint[1] = new double[20];
Mam nadzieję, że to pomoże!
 517
Author: James Michael Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 14:50:33

W pierwszym przypadku próbujesz utworzyć coś, co nazywa się postrzępioną tablicą.

double[][] ServicePoint = new double[10][9].

Powyższe stwierdzenie zadziałałoby, gdyby zostało zdefiniowane jak poniżej.

double[][] ServicePoint = new double[10][]

Oznacza to, że tworzysz tablicę o rozmiarze 10, która może przechowywać w niej 10 tablic różnej wielkości it.In proste terminy tablica tablic.zobacz poniższy obrazek, który oznacza postrzępione / align = "left" /

Tutaj wpisz opis obrazka

Http://msdn.microsoft.com/en-us/library/2s05feca (v=vs.80). aspx

Druga jest w zasadzie dwuwymiarową tablicą, a składnia jest poprawna i akceptowalna.

  double[,] ServicePoint = new double[10,9];//<-ok (2)

I aby uzyskać dostęp lub zmodyfikować tablicę dwuwymiarową, musisz przekazać oba wymiary, ale w Twoim przypadku przekazujesz tylko jeden wymiar, dlatego błąd

Poprawne użycie to

ServicePoint[0][2] ,odnosi się do elementu w pierwszym rzędzie, trzecim kolumna.

Obrazowy obraz twojej dwuwymiarowej tablicy

Tutaj wpisz opis obrazka

 223
Author: Prabhu Murthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 14:53:54

double[][] są nazywane postrzępione tablice , Wymiary wewnętrzne nie są określone w deklaracji. W przeciwieństwie do tablica prostokątna, każda tablica wewnętrzna może mieć dowolną długość. Każda tablica wewnętrzna jest domyślnie inicjowana na wartość null, a nie pustą. każda tablica wewnętrzna musi być utworzona ręcznie: Reference [C# 4.0 in nutshell the definitive Reference]

for (int i = 0; i < matrix.Length; i++)
{
    matrix[i] = new int [3]; // Create inner array
    for (int j = 0; j < matrix[i].Length; j++)
        matrix[i][j] = i * 3 + j;
}

double[,] są wywoływane rectangular arrays, które są deklarowane za pomocą przecinków do oddzielenia każdego wymiar. Poniższy fragment kodu deklaruje prostokątną dwuwymiarową tablicę 3 na 3, inicjalizując ją liczbami od 0 do 8:

int [,] matrix = new int [3, 3];
for (int i = 0; i < matrix.GetLength(0); i++)
    for (int j = 0; j < matrix.GetLength(1); j++)
        matrix [i, j] = i * 3 + j;
 63
Author: Adil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 20:07:58

double[,] jest tablicą 2d (macierz) natomiast {[2] } jest tablicą tablic ( ) i składnia jest następująca:

double[][] ServicePoint = new double[10][];
 19
Author: Omar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-20 19:01:11

double[][] jest tablicą tablic i double[,] jest macierzą. Jeśli chcesz zainicjalizować tablicę array, musisz to zrobić:

double[][] ServicePoint = new double[10][]
for(var i=0;i<ServicePoint.Length;i++)
    ServicePoint[i] = new double[9];

Weź pod uwagę, że użycie tablic tablic pozwoli Ci mieć tablice o różnej długości:

ServicePoint[0] = new double[10];
ServicePoint[1] = new double[3];
ServicePoint[2] = new double[5];
//and so on...
 9
Author: Ivo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 14:49:24