Forum: PC-Programmierung Ausprobieren ob ID im Array Gültig ist


von baer (Gast)


Lesenswert?

Hallo,

ich bin gerade am lernen von C#...

ich habe mir ein Array erstellt, in welchen Informationen stehen über 
die Konsole kann ich mit einer ID einfach eine Position raussuchen 
anschließend werden mir dann die Informationen angezeigt.

jetzt habe ich ein Array mit 50 Feldern...

wenn ich jetzt -1 oder 50 eingebe kommt natürlich eine Exception...

ich habe es mit try & catch versucht, allerdings fehlt mir da der 
richtige Ansatz...
<- ich möchte nicht das Array zurück geben sondern erstmal nur die ID
1
            bool isID = false;
2
            int inputID = 0;
3
4
            do
5
            {
6
                try
7
                {
8
                    inputID = Convert.ToInt32(Console.ReadLine());
9
                    if( myArray[inputID -1].id >= 0)
10
                        isID = true;
11
                }
12
                catch (FormatException)
13
                {
14
                    Console.WriteLine("dies war keine gültige ID! Bitte erneut eine Zahl zwischen {0} und {1} eingeben.", 1, myArray.Length);
15
                    isID = false;
16
                }
17
            } while (!isID);
18
            return inputID -1;

hat jemand eine gute Idee für mich

Vielen Dank

von STK500-Besitzer (Gast)


Lesenswert?

1
            bool isID = false;
2
            int inputID = 0;
3
4
            do
5
            {
6
                inputID = Convert.ToInt32(Console.ReadLine());
7
                if ((inputID > 0) && (inputID < myArray.Length){
8
                    if( myArray[inputID -1].id >= 0)
9
                        isID = true;
10
                }
11
                else
12
                {
13
                    Console.WriteLine("dies war keine gültige ID! Bitte erneut eine Zahl zwischen {0} und {1} eingeben.", 1, myArray.Length);
14
                }
15
            } while (!isID);
16
            return inputID-1;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

STK500-Besitzer schrieb:
> if ((inputID > 0) && (inputID < myArray.Length){

Da fehlt eine Klammer und obendrein sollte der zweite Vergleich statt < 
<= verwenden, sonst wird das letzte Arrayelement unterschlagen.

von c-hater (Gast)


Lesenswert?

baer schrieb:

> ich habe mir ein Array erstellt, in welchen Informationen stehen über
> die Konsole kann ich mit einer ID einfach eine Position raussuchen
> anschließend werden mir dann die Informationen angezeigt.

Nein. Was du meinst, ist keine "ID", sondern schlicht und einfach ein 
Array-Offset.

> jetzt habe ich ein Array mit 50 Feldern...
>
> wenn ich jetzt -1 oder 50 eingebe kommt natürlich eine Exception...

Weil halt der Offset ausserhalb des gültigen Bereichs ist. Das sollte 
nie passieren, wenn man korrekten Code programmiert hat. Du hast Glück, 
dass "managed code" wie der von C# produzierte Arrayzugriffe 
diesbezüglich überwacht und die Exception wirft, anstatt wild in 
irgendwelchem Speicher rumzuschreiben, der überhaupt nicht zum Array 
gehört.

> ich habe es mit try & catch versucht, allerdings fehlt mir da der
> richtige Ansatz...

Mit try & catch kann man das zwar durchaus lösen, ist aber nicht gerade 
optimal. Sowas macht man sinnvollerweise nur, wenn es wirklich keine 
andere Möglichkeit gibt, einen potentiellen Fehler vorbeugend zu 
erkennen. Die gibt es aber hier:

Der Bereich der zulässigen Offsets für ein Array fängt in C# immer beim 
Offset 0 an und hört bei der Länge des Arrays - 1 auf.

Auf die Länge des Arrays kann man über die Eigenschaft "Length" 
zugreifen. Wirklich wenig überraschend...

von STK500-Besitzer (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Da fehlt eine Klammer und obendrein sollte der zweite Vergleich statt <
> <= verwenden, sonst wird das letzte Arrayelement unterschlagen.

ADHS... ;)

c-hater schrieb:
> Der Bereich der zulässigen Offsets für ein Array fängt in C# immer beim
> Offset 0 an und hört bei der Länge des Arrays - 1 auf.

Es geht aber darum, dass der Bediener etwas eingibt, das ihm geläufig 
ist.
Wenn man etwas für Benutzer, die keinen näheren technischen Bezug haben, 
programmiert, ist es für die einfacher wenn man ab 1 indiziert.
Wie man das intern verarbeitet, ist was anderes, solange es sauber 
funktioniert.

von Lutz (Gast)


Lesenswert?

1
if ((inputID < 0) || (inputID > (myArray.Length-1)))
2
  Console.WriteLine("dies war keine gültige ID!...
try & catch sollte wirklich nur für die unerwarteten/unwahrscheinlichen 
Sachen genutzt werden, da zu Aufwändig.

von STK500-Besitzer (Gast)


Lesenswert?

Lutz schrieb:
1
 if ((inputID < 0) || (inputID > (myArray.Length-1)))
2
  Console.WriteLine("dies war keine gültige ID!...

das müsste dann aber
1
 if ((inputID < 1) || (inputID > (myArray.Length-1)))

heissen...

von bluppdidupp (Gast)


Lesenswert?

>inputID = Convert.ToInt32(Console.ReadLine());
...man kann statt Convert.ToInt32() auch Int32.TryParse() nutzen, wenn 
man davon ausgehen kann, dass da schonmal kein Int32 eingegeben wird.
Ich persönlich setze bei sowas auch immer noch zusätzlich String.Trim() 
ein: Wenn mal die Zwischenablage involviert ist, passiert es recht 
schnell, dass der Benutzer mal irgendwelche Leerzeichen oder ähnliches 
mit kopiert hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.