Entwickler-Ecke

C# - Die Sprache - von for Scheife zum foreach....


tomycat - Mi 30.06.21 09:04
Titel: von for Scheife zum foreach....
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?


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 - 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 [https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/arrays/multidimensional-arrays] und verzweigten (jagged) Arrays [https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/arrays/jagged-arrays] kennen.
Für das Auslesen der verschiedenen Dimensionen bei mehrdim. Arrays gibt es die Methode GetLength(dimension) [https://docs.microsoft.com/de-de/dotnet/api/system.array.getlength], 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).


tomycat - 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?

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


Ralf Jansen - 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.


tomycat - 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:
https://www.tutorialspoint.com/chash-program-to-loop-over-a-two-dimensional-array


Th69 - 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.