| Autor |
Beitrag |
waserm
Hält's aus hier
Beiträge: 4
|
Verfasst: Di 19.05.09 15:58
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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 19.05.09 16:19
Hallo und
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
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 19.05.09 17:25
|
|
psirus
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 339
Erhaltene Danke: 20
Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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:
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 20.05.09 13:13
Wunderbar, jetzt funktioniert das ganze wie es soll.
Danke!!
|
|