Wie initialisierst du ein zweidimensionales Array, wenn du die Größe nicht kennst?

8

Ich habe ein zweidimensionales Array, in das ich Daten laden muss. Ich kenne die Breite der Daten (22 Werte), aber ich kenne die Höhe nicht (ungefähr 4000 Datensätze geschätzt, aber variabel).

Ich habe es wie folgt erklärt:

%Vor%

Das verursacht eine NullReferenceException, wenn ich versuche, es so zu initialisieren:

%Vor%

Ich bekomme eine "Array-Erstellung muss Array-Größe oder Array-Initialisierer haben."

Danke, Keith

    
Keith Sirmons 08.09.2008, 20:09
quelle

6 Antworten

8

Sie können kein Array verwenden. Oder Sie müssten eine Größe wählen, und wenn Sie mehr benötigen, müssen Sie ein neues, größeres Array zuweisen, die Daten von der alten in die neue kopieren und weitermachen wie bisher (bis Sie überschreiten die Größe des neuen ...)

Im Allgemeinen würden Sie mit einer der Auflistungsklassen - ArrayList, List & lt; & gt ;, LinkedList & lt; & gt; usw. - gehen, was sehr davon abhängt, wonach Sie suchen; Liste wird Ihnen das am nächsten kommen, was ich anfangs beschrieben habe, während LinkedList & lt; & gt; vermeidet das Problem häufiger Neuzuordnungen (auf Kosten von langsameren Zugriffen und größerer Speicherauslastung).

Beispiel:

%Vor%

Oh, und es ist erwähnenswert (als Shog9 08.09.2008, 20:23

quelle
2

Sie können in .NET kein Array erstellen (statt einen Verweis darauf zu deklarieren, was Sie in Ihrem Beispiel getan haben), ohne seine Dimensionen explizit oder implizit anzugeben, indem Sie einen Satz Literalwerte angeben Sie initialisieren es. (z.B. int [,] array4 = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};)

Sie müssen zuerst eine Datenstruktur variabler Größe verwenden (eine generische Liste von 1-d-Arrays mit 22 Elementen wäre die einfachste) und dann Ihr Array zuweisen und Ihre Daten hineinkopieren, nachdem Ihr Lesevorgang beendet ist und Sie wissen Wie viele Zeilen brauchst du?

    
McKenzieG1 08.09.2008 20:24
quelle
1

Ich würde einfach eine Liste verwenden und dann diese Liste in ein Array konvertieren.

Sie werden hier bemerken, dass ich ein gezacktes Array (float [] []) anstelle eines quadratischen Arrays (float [,]) verwendet habe. Abgesehen davon, dass es "Standard" ist, sollte es viel schneller gehen. Wenn Sie die Daten von einer Liste in ein Array konvertieren, müssen Sie nur [calibratorRow] Zeiger kopieren. Wenn Sie ein quadratisches Array verwenden, müssen Sie [calibrationRow] x [SensorCount] floats kopieren.

%Vor%     
Jonathan Allen 08.09.2008 20:27
quelle
0

Ich benutze im Allgemeinen die netteren Sammlungen für diese Art von Arbeit (List, ArrayList usw.) und dann (wenn wirklich notwendig) nach T [,], wenn ich fertig bin.

    
Daren Thomas 08.09.2008 20:25
quelle
0

Sie müssten das Array entweder auf eine maximale Größe (float [999,22]) vorbelegen oder eine andere Datenstruktur verwenden.

Ich schätze, du könntest im Handumdrehen kopieren / skalieren ... (aber ich glaube nicht, dass du das willst)

Ich denke, die Liste klingt vernünftig.

    
ShoeLace 08.09.2008 20:26
quelle
0

Sie können auch eine zweidimensionale ArrayList (aus System.Collections) verwenden - Sie erstellen eine ArrayList und fügen dann eine andere ArrayList ein. Dies gibt Ihnen die dynamische Größenanpassung, die Sie benötigen, aber auf Kosten von ein wenig Overhead.

    
Guy Starbuck 08.09.2008 20:28
quelle

Tags und Links