Entwickler-Ecke
C# - Die Sprache - array of lists how to access item
waserm - Di 19.05.09 15:58
Titel: array of lists how to access item
Hallo
ich habe einen array von Listen erstellt, und möcht nun die einzelnen items wieder aufrufen. wie mach ich das am einfachsten?
die definition sieht folgendermassen aus:
List<double[]>[] name = new List<double[]>[2];
ich habe es mittels for schlaufen über alle möglichen inizes versucht und leider immer nur das Letzte element der Liste erhalten. im double array konnte ich jedoch auf die einzelnen elemente zugreifen.
am liebsten wäre mir eine methode, um direkt auf ein elemet zugreifen zu können im stile von name[][][], leider habe ich das noch nicht hingekriegt.
vielen dank für die hilfe
JüTho - Di 19.05.09 16:19
Hallo und :welcome:
Das kommt mir etwas sehr kompliziert vor: Du benutzt ein double-Array, dann machst du eine Liste von solchen Arrays, und dann machst du noch ein Array von zwei solchen Listen.
| Zitat: |
| ich habe es mittels for schlaufen über alle möglichen inizes versucht und leider immer nur das Letzte element der Liste erhalten. |
Dazu kann ich natürlich nur etwas sagen, wenn du den Code hier zeigst. Eine Möglichkeit ist, dass die Variable falsch deklariert ist oder die Auswertung falsch abläuft. Du musst den
Geltungsbereich von Variablen beachten.
Du solltest konkret sagen, was du eigentlich machen willst; dann kann man dir vielleicht ein besseres Vorgehen vorschlagen. Als Alternative fällt mir Dictionary<T, U> ein.
Gruß Jürgen
psirus - Di 19.05.09 16:57
Hallo waserm,
ich halte dein Konstrukt auch für etwas sehr komplex und denke dass es (wahrscheinlich) einfacher gehen würde.
Aber hier mal, wie du damit umgehen kannst. Den Zugriff demonstrier ich anhand des ersten Eintrags. Der index muss dann entsrechend für andere Elemente angepasst werden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| List<double[]>[] name = new List<double[]>[2];
name[0] = new List<double[]>(); name[1] = new List<double[]>(); name[0].Add(new double[2]);
name[0].ElementAt(0)[0] = 1.0; |
Wie gesagt würde ich aber die Struktur noch mal überdenken, da sonst schnell mal vergessen wird eine Liste zu erzeugen oder ausserhalb des Index Bereichs zugegriffen wird.
MFG
Kha - Di 19.05.09 17:25
psirus hat folgendes geschrieben : |
|
Nein, mit einem Indexer:
Enumerable.ElementAt ist eine Extension Method, die besser nie existiert hätte ;) .
psirus - Di 19.05.09 20:10
@Kha Danke für den Hinweis. Bin's vom C++ Vector und dessen .at() gewohnt wegen Indexgrenzen. Hat der Indexer gegenüber ElementAt() besondere Vorteile/Nachteile (ausser natürlich weniger Tipparbeit und Lesbarkeit)? Microsoft wird sich denk ich mal was dabei gedacht haben als sie ElementAt() eingeführt haben.
Greenberet - Di 19.05.09 22:08
psirus hat folgendes geschrieben : |
| @Kha Danke für den Hinweis. Bin's vom C++ Vector und dessen .at() gewohnt wegen Indexgrenzen. Hat der Indexer gegenüber ElementAt() besondere Vorteile/Nachteile (ausser natürlich weniger Tipparbeit und Lesbarkeit)? Microsoft wird sich denk ich mal was dabei gedacht haben als sie ElementAt() eingeführt haben. |
Wenn es sich um eine Liste handelt( abgeleitet von IList<> ), dann macht ElementAt() nichts anderes als "return list[index];". Falls nicht, geht ElementAt() die einzelnen elemente via IEnumerable<>.MoveNext() durch bis die Position "index" erreicht wurde und gibt diese dann zurück.
waserm - Mi 20.05.09 08:17
Guten Morgen
Vielen Dank für eure Antworten. Ich werde sie im Verlaufe des Vormittages testen. Hier noch de Quellcode, den ich verwende:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main() {
List<double[]>[] test = new List<double[]>[2]; List<double[]> test3 = new List<double[]>(); double[] x = new double[3];
for (int k = 0; k<2; k++) { for (int i = 0; i < 10; i++) { x[0] = i+1; x[1] = k+1; x[2] = (k + 1) * (i+1);
for (int f = 0; f < 3; f++) { Console.Write("x[{0}]: {1}, ",f,x[f]); } Console.WriteLine(""); Console.ReadKey();
test3.Add(x); }
test[k] = test3; } for (int k = 0; k < 2; k++) { for (int i = 0; i < 10; i++) {
Console.Write("\n i: {0}, k: {1}\n", i, k); Console.ReadKey(); System.Threading.Thread.Sleep(100);
for (int f = 0; f < 3; f++) { Console.Write("f: {0}, Wert: {1}, \n", f, test[k][i][f]); Console.ReadKey();
} } } } } } |
Als Resultat erhalte ich leider nur den letzten Eintrag: 10,2,20. Egal für welche Indices.
waserm - Mi 20.05.09 12:44
Jetzt wird es für mich richtig verwirrend. Ich habe nun noch eine Ausgabe eingebaut, nach dem ich das Element der Liste zugefügt habe. An dieser Position sind dei Werte noch richtig.
Hier der neue Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main() {
List<double[]>[] test = new List<double[]>[2]; test[0] = new List<double[]>(); test[1] = new List<double[]>(); double[] x = new double[3]; for (int k = 0; k<2; k++) { for (int i = 0; i < 10; i++) { x[0] = i+1; x[1] = k + 1; x[2] = (k + 1) * (i + 1);
test[k].Add(x);
for (int f = 0; f < 3; f++) {
Console.Write("k,i: {0} {1}; Wert: {2}\n", k, i, test[k][i][f]); } }
} for (int k = 0; k < 2; k++) {
for (int i = 0; i < 10; i++) { Console.Write("\n i: {0}, k: {1}\n", i, k); Console.ReadKey(); System.Threading.Thread.Sleep(100);
for (int f = 0; f < 3; f++) { Console.Write("f: {0}, Wert: {1}, \n", f, test[k][i][f]); Console.ReadKey();
} } } } } } |
Beim Auslesen auf Zeile 34 liefert die richtigen Werte, wärend das Auslesen auf Zeile 50 nur noch den letzten gespeicherten Wert ausgibt.
Für mich unverständlich, da ich ja an beiden Stellen die selbe Formulierung verwende.
Kha - Mi 20.05.09 13:00
Arrays sind Referenztypen: Jede List enthält nur Referenzen auf dieses eine Array "x". Verschiebe double[] x = new double[3]; in die i-Schleife, dann hast du auch wirklich 20 verschiedene Array-Objekte.
waserm - Mi 20.05.09 13:13
Wunderbar, jetzt funktioniert das ganze wie es soll.
Danke!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!