C# - Zeilen multi-dimensional arrays
In der Programmiersprache C#, wie gebe ich eine Zeile aus einem mehrdimensionalen array? Angenommen ich habe Folgendes:
int[,] foo;
foo = new int[6,4];
int[] least;
least = new int[6];
for(int i = 0; i < 6; i++)
{
least[i] = FindLeast(ref foo[i]); //How do I pass the ith row of foo???
}
Auch, könnte jemand mir erklären, die davon profitieren, dass Sie rechteckig und jagged arrays in C#? Tritt dies in anderen Programmiersprachen? (Java?)
Vielen Dank für alle Hilfe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie können nicht passieren Sie eine Reihe von rechteckigen Arrays, verwenden Sie ein verzweigtes array (ein array von arrays):
BEARBEITEN
Wenn Sie finde es so ärgerlich zu verwenden, die ein verzweigtes array und brauche dringend einen rechteckigen, mit einem einfachen trick sparen Sie:
Nicht, mit einem rechteckig - array so. Es ist ein einzelnes Objekt.
Stattdessen würden Sie brauchen, um eine zackig - array, wie diese:
Dann können Sie passieren jedem "sub"-array:
Beachten Sie, dass es keine Notwendigkeit gibt, pass
foo[i]
durch Verweis1, und auch es ist eine gute Idee weisen Sie den lokalen Variablen-Werte an die Stelle der Erklärung, wenn Sie können. (Es macht den code kompakter und einfacher zu verstehen.)1 Wenn du dir nicht sicher bist, möchten Sie vielleicht Lesen Sie meinen Artikel auf Parameterübergabe in C#.
Update: Wie Jon Skeet zu Recht darauf hin, nicht eine Referenz, um die Zeile, sondern erstellt eine neue Kopie. Wenn Ihr code braucht, um ändern Folge, diese Methode funktioniert nicht. Ich habe umbenannt, die Methode, um dies deutlich zu machen.
Update 2: Wenn Sie wollen, um in der Lage zu Bearbeiten Sie die Felder, und die änderungen geschehen auf der übergeordneten array zu verwenden, können Sie den wrapper, die ich in diese Bibliothek, die ich maed. Die resultierende Zeile
foo.Row(i)
ist kein array, sondern implementiertIList
, so dass, wenn Sie müssen zu übergeben Sie ein array, das ist keine Lösung, entweder.Diese Erweiterung Methode wird erlauben Sie, um Abfrage ein mehrdimensionales array für die Zeilen. Es sollte beachtet werden, dass dies rechnerisch schwer (nicht effizient) und wenn ist es möglich, die Sie verwenden sollten ein verzweigtes array für diese Situationen. Wenn, jedoch, finden Sie sich in einer situation, wo Sie nicht verwenden können, ein verzweigtes array, könnte dies nützlich sein.
Kann der code nun umgeschrieben werden:
FindLeast
ändert das array, dann ist diese änderung nicht sichtbar, in das Ergebnis. Darüber hinaus wird das Ergebnis derfoo.Row(i)
ist nicht klassifiziert als eine variable, so dass der code nicht kompiliert. Sie einfach nicht Behandlung von einem rechteckigen array, als ob es ein verzweigtes array - arrays einfach nicht wie das funktioniert.FindLeast
nicht ändern Sie die Zeile, diese sollte funktionieren. Ich werde die Methode umbenennen, obwohl 🙂FindLeast
Beispiel, aber es nicht Adresse die mehr Allgemeine Frage der Weitergabe einer einzelnen Zeile in einem rechteckigen array wie ein eindimensionales array, welches (wie ich immer wieder sagen) unmöglich.CopyRow
Methode. Tatsächlich scheint nicht umgeschrieben werden, in keiner Weise. Auch die Reihenfolge der übergebenen strings an dieArgumentOutOfRangeException
Konstruktor ist falsch - der name des Parameters sollte zuerst kommen.Row
->CopyRow
). Behoben.