Autor Beitrag
tomycat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.06.21 09:04 
hallo,
ich habe ein Array mit einem Block und jeder Block hat eine Line.
Mit einer for-Schleife alter Schule, keine Problem.

Problem:

1. Ein 2 Dim. Array deren Größen unbekannt sind. Wie definiere ich den 2 dim. Key?
2. Die 2 Schleifen die alles auslesen. So geht´s. Wie muss man die Schleife umbauen, wenn der Block 1000 groß ist?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
string[,] key = new string[20,20];

// key .... werden befüllt, es können 1000 Blöcke sein und eine Line oder umgekehrt.

// key kommt aus einer Datei.

for (int block = 0; block < 3; block++)
{
    for (int line = 0; line < 4; line++)
    {                 
        if(key[block, line] == "test12345")
        {
            Console.WriteLine("----> " + key[block, line]);                     
        }
    }               
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.06.21 09:44 
Wieso hast du ein 20x20 großes Array, wenn du dann nur 3x4 bearbeitest?

Möchtest du überhaupt konstante Arraygrenzen? Wäre nicht eine verschachtelte List<> hier besser?
Du solltest auch den Unterschied von mehrdimensionalen (multidimensional) Arrays und verzweigten (jagged) Arrays kennen.
Für das Auslesen der verschiedenen Dimensionen bei mehrdim. Arrays gibt es die Methode GetLength(dimension), d.h. du kannst diese mit separaten for-Schleifen benutzen (oder eine einzelne foreach-Schleife, welche über alle Einträge iteriert - sofern du die Indizes nicht benötigst).

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.06.21 10:00 
sorry, ich muss meine Frage anders stellen.

die größe vom Block und Line ist unbekannt.
Jeder Block habe Zeilen(line).

1.Schleife: jeder Block soll gelesen werden.
2.Schleife: in einem Block solle jeder Zeile(line) untersucht werden.

Für eine Dim, wäre das die Lösung, wie sieht das mit 2 Dim aus?
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
int[] a = new int[4];
a[0] = 0;
a[1] = 1;
a[2] = 2;
a[3] = 3;         

// die größe für a sind unterschiedlich. Deswegen von FOR weg und zu foreach

foreach (int number in a)
{
    Console.WriteLine(number);
    if(number == 1)
    {
        Console.WriteLine("yes");
    }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.06.21 10:05 
Du versteifst dich zu sehr auf das Ändern von for zu foreach.
Benutze einfach eine dynamische Liste: List<List<string>>

Für diesen Beitrag haben gedankt: tomycat
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 30.06.21 11:18 
Ob Array oder List<T> oder irgendwas anderes ist egal. Alles sind aufzählbare Typen (IEnumerable(s))
Und ob vor foreach oder for ist ebenso egal beides geht mit aufzählbaren Typen.

Ob for oder foreach solltest du daran festmachen ob du nochmal einen indexierten Zugriff auf das zu iterierende Ding brauchst (dann for) oder ob dir in der Schleife das aktuelle Objekt reicht (dann foreach).
Iteriert wird immer über eine Dimension. Insofern hast du üblicherweise auch immer soviel geschachtelte Schleifen wie du Dimensionen hast. Insbesondere bei Dimensionen die in sich nicht die gleiche Länge haben. (Ausgenommen Sonderfälle oder die Benutzung von Techniken z.b. Linq wo du die Schleifen nur nicht mehr siehst)

Das wechseln von for nach foreach wegen der dynamischen Größe ist auch unnötig sowohl Array als auch eine List<T> kennen ihre Größe man muss in einem for keine Konstante benutzen.

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 265
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.06.21 12:47 
thx für den Tipp,
leider ist mein Projekt voll auf 2 Dim. Array aufgebaut.
Für das nächste projekt schaue ich mir deinen Tip an.

Meine Lösung:
www.tutorialspoint.c...wo-dimensional-array
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.06.21 12:59 
Das ist aber trotzdem die falsche Datenstruktur (laut deiner Beschreibung bzgl. Blöcke und Line).
Die Umstellung sollte nicht sehr viel Umbau bedeuten (eigentlich nur das Erzeugen der Daten).

Und statt GetUpperBound(dim) benutze, wie von mir schon geschrieben, GetLength(dim), damit die for-Schleife die normale Form mittels < (und nicht <=) hat.