Autor Beitrag
waserm
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
List<double[]>[] name = new List<double[]>[2];

// für den Array Eintrag eine Liste erzeugen. 
name[0] = new List<double[]>();
// !Wichtig: es muss für jedes Element des Arrays eine Liste erzeugt werden bevor du darauf zugreifst. Ansonsten gibts ne "System.NullReferenceException"
name[1] = new List<double[]>();  // !

// zu deiner Liste des Index kannst du nun beliebig viele double Arrays hinzufügen. Hier mal eines mit 2 Elementen
name[0].Add(new double[2]);

// Lesend/schreibend zugreifen.
// name[0] -> jetz bist du bei deiner Liste
// ElementAt(0) -> bei Listen wird mit "ElementAt(index)" darauf zugegriffen. Jetz bist du bei deinem double Array
// [0] -> Zugriff auf den Index deines double Arrays
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 19.05.09 17:25 
user profile iconpsirus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
// ElementAt(0) -> bei Listen wird mit "ElementAt(index)" darauf zugegriffen.					
Nein, mit einem Indexer:
ausblenden C#-Quelltext
1:
name[i][j][k]					

Enumerable.ElementAt ist eine Extension Method, die besser nie existiert hätte ;) .

_________________
>λ=
psirus
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Di 19.05.09 22:08 
user profile iconpsirus hat folgendes geschrieben Zum zitierten Posting springen:
@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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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:

ausblenden volle Höhe 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];

            //Füllen des Arrays
            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;
            }
            
            //Auslesen des Arrays
            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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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:

ausblenden volle Höhe 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];
                       
            
            //Füllen des Arrays
            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();

                    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]);
                    }
                    }

                //test[k] = test3;
            }
            
            //Auslesen des Arrays
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 20.05.09 13:13 
Wunderbar, jetzt funktioniert das ganze wie es soll.

Danke!!