Wie wollen Sie initialisieren ein 2-dimensionales array, wenn Sie nicht wissen, die Größe
Ich habe ein zweidimensionales array, das ich brauche, um die Daten geladen werden sollen. Ich weiß, die Breite der Daten (22 Werte), aber ich weiß nicht, die Höhe (geschätzt rund 4000 Datensätze, aber variable).
Habe ich es wie folgt deklariert:
float[,] _calibrationSet;
....
int calibrationRow = 0;
While (recordsToRead)
{
for (int i = 0; i < SensorCount; i++)
{
_calibrationSet[calibrationRow, i] = calibrationArrayView.ReadFloat();
}
calibrationRow++;
}
Dies bewirkt, dass eine NullReferenceException-Ausnahme, also wenn ich versuche zu initialisieren, wie diese:
_calibrationSet = new float[,];
Bekomme ich ein "Array-Erstellung muss die array-Größe oder-array-Initialisierer."
Danke,
Keith
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht verwenden Sie ein array.
Oder eher, würden Sie brauchen, um wählen Sie die Größe, und wenn Sie am Ende brauchen mehr als Sie müssten ein neues, größeres array kopieren Sie die Daten aus der alten in die neue ein, und weiter wie vorher, bis Sie mehr als die Größe der neuen...)
In der Regel, Sie gehen würde, mit der man die collection - Klassen (ArrayList, List<>, LinkedList<> usw. - welche, hängt stark auf, was Sie suchen; Liste wird Ihnen die nächste Sache, was ich beschrieben zunächst, während LinkedList<> vermeiden Sie das problem von häufigen re-Allokationen (auf Kosten der langsameren Zugriff und größerer Speicher).
Beispiel:
Oh, und es ist bemerkenswert, (als Grauenwolf habe), dass das, was ich hier nicht geben Sie die gleiche Speicher-Struktur als single -, multi-dimensional array würde - unter der Haube, es ist ein array von Referenzen auf andere arrays, die tatsächlich die Daten aufzunehmen. Dies beschleunigt den Aufbau der array-ein gutes Angebot, indem Sie die Umverteilung billiger, aber können haben einen Einfluss auf die Zugriffsgeschwindigkeit (und, natürlich, Speicherauslastung). Ob dies ein Problem für Sie, hängt eine Menge auf, was werden Sie tun mit den Daten, nachdem Sie geladen ist... und ob es zwei hundert Datensätze oder zwei Millionen Datensätze.
Können Sie nicht erstellen Sie ein array .NET (im Gegensatz zu der Deklaration einer Referenz, das ist das, was du getan hast in deinem Beispiel), ohne Angabe seiner Abmessungen, entweder explizit, oder implizit durch die Angabe einer Reihe von literalen Werten, wenn Sie Sie initialisieren. (z.B. int[,] array4 = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };)
Müssen Sie eine variable Größe Datenstruktur, die erste (eine generische Liste von 22-element-1-d-arrays wäre das einfachste) und dann zuweisen, das array und kopieren Sie die Daten in es nach Ihr Lesen fertig ist, und Sie wissen, wie viele Zeilen Sie benötigen.
Ich würde nur eine Liste verwenden, dann wandeln Sie diese Liste in ein array.
Werden Sie feststellen, dass ich hier verwendet eine verzweigte array (float [] []), anstatt ein quadratisches array (float [,]). Neben der "standard" Weg, Dinge zu tun, es sollte viel schneller sein. Bei der Umwandlung der Daten aus einer Liste in ein array, die Sie nur kopieren müssen [calibrationRow] Zeiger. Mit einem quadratischen array, würden Sie müssen kopieren [calibrationRow] x [SensorCount] schwebt.
Ich verwende in der Regel die schönere Sammlungen, die für diese Art von Arbeit (List, ArrayList, usw.) und dann (wenn wirklich nötig) cast auf T[,] wenn ich fertig bin.
würden Sie entweder müssen preallocate das array zu einer Maximalen Größe (float[999,22] ) , oder verwenden Sie eine andere Datenstruktur.
ich denke, man kann kopieren, verkleinern und auf die Fliegen.. (aber ich glaube nicht, dass du würdest wollen)
ich denke, die Liste klingt vernünftig.
Sie können auch eine zwei-dimensionale ArrayList (aus System.Sammlungen) -- erstellen Sie eine ArrayList, dann legen Sie eine andere ArrayList drin. Dies gibt Ihnen die dynamische Größenanpassung, die Sie benötigen, aber auf Kosten von ein bisschen overhead.