Ausprobieren ob ID im Array Gültig ist

Gast #5024148
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
Gast #5024180
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;
Gast #5024247
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...
Gast #5024289
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.
Gast #5024505
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.
Gast #5024763
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren