Entwickler-Ecke
Basistechnologien - if-anweisung index außerhalb des arraybereiches
lukll1 - Mo 01.09.14 19:58
Titel: if-anweisung index außerhalb des arraybereiches
hallo,
ich habe eine if-anweisung programmiert, und weiß aber nicht was falsch ist:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if (Linie[0] == null) { m_tbausgabe.Text += "0"; } else { m_tbausgabe.Text += Linie[0]; } |
zur veranschaulichung:
habe eine textdatei, wenn in dieser textdatei in zeile 1(also index 0) nichts drinnen steht, dann soll er 0 ausgeben, das funktioniert aber nicht, wenn allerdings was in der zeile 1 steht, funktioniert die ausgabe ohne probleme.
es wird immer diese Zeile
if (Linie[0] == null) markiert und immer bei programmstart abgebrochen, gelbt unterlegt und als fehlermeldung index war außerhalb des arraybereiches angezeigt.
Christian S. - Mo 01.09.14 20:08
Wenn in der ersten Zeile nichts steht (die Datei also leer ist), dann wird Linie keine Elemente enthalten, also kannst Du auch nicht auf das 0-te Element zugreifen (weil es das nicht gibt). Am Besten prüfst Du mittels Linie.Length, ob mindestens ein Element in dem Array vorhanden ist.
Ralf Jansen - Mo 01.09.14 20:09
Dann hat die Liste/Array/Enumerable mit Namen Liste keine Einträge und die Länge 0.
Du musst also auf die Länge von Linie testen und potentiell auch darauf ob Linie selbst null ist.
lukll1 - Di 02.09.14 11:23
ok, danke für die info, werde ich gleich mal versuchen
lukll1 - Di 02.09.14 16:37
so, habe es hinbekommen, bin aber auf einen weiteren fehler draufgekommen;
wenn ich die Zahlen absteigend sortiere, mit Array.Sort(Linie); Array.Reverse(Linie);, dann passt es zwar, aber wenn ich 15 reinschreibe, dass ist kleiner wie 2, also ist das Problem, dass es immer nur die erste Zahl nimmt und sortiert nach der anscheinend, aber wieso bzw. was kann ich dagegen machen?
Ralf Jansen - Di 02.09.14 16:52
Zitat: |
wenn ich die Zahlen absteigend sortiere |
Es sind keine Zahlen sondern vermutlich hast du ein string Array. Und die Zeichenfolge 15 ist kleiner 2. Genauso wie AA kleiner B ist auch wenn da 2 A stehen.
Wenn da nur Zahlen (als strings kodiert) drin sind mußt du zum Sortieren einen Zahlendatentyp daraus machen (also zum Beispiel Int32) damit die Sortierregeln für Zahlen gelten.
Aber bedenke Das funktioniert dann NUR für Zahlen. Leere Zeilen währen zum Beispiel keine Zahlen.
lukll1 - Di 02.09.14 17:38
ja ich habe ein string-array;
naja, dass array kann man ja nicht in int umwandeln, weder mit int.parse noch mit convertoint32,oder was meinst du, dass ich umwandeln soll in int?
Ralf Jansen - Di 02.09.14 17:41
Du mußt schon die Werte im Array umwandeln nicht das Array und das umgewandelte dann sortieren.
Eine Möglichkeit wäre
C#-Quelltext
1:
| Linie = Linie.OrderBy(x => Convert.ToInt32(x)).ToArray(); |
lukll1 - Di 02.09.14 17:45
das funktioniert aber auch nicht...
Ralf Jansen - Di 02.09.14 17:48
a.) es war ein Beispiel
b.) heißt du mußt es auf dein konkretes Problem anwenden.
c.) das geht nur wenn alles in dem string Array auch als Zahl darstellbar ist, ist das so ?
d.) "Funktioniert nicht" ist eine Feststellung bei der dir keiner helfen kann.
lukll1 - Di 02.09.14 17:52
ja dass ist mir schon klar :wink:
wie meinst du dass?, dein lösungsvorschlag passt doch genau zu meinem problem
im string array sind nur zahlen, also geht dass sicher
ok, also es ist gleich wie vorher, 2 ist noch immer größer wie 15
Ralf Jansen - Di 02.09.14 18:08
Ein vollständiges Beispiel
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| class Program { static void Main(string[] args) { string[] Linie = { "17", "19", "5", "3", "29", "2", "15", "3" }; Linie = Linie.OrderBy(x => Convert.ToInt32(x)).ToArray(); Console.WriteLine(string.Join(", ", Linie)); } } |
Output
Quelltext
1:
| 2, 3, 3, 5, 15, 17, 19, 29 |
Sieht korrekt aus.
Palladin007 - Mi 03.09.14 09:24
Kleine Ergänzung:
Wenn das sowieso nur Zahlen sind, dann würde ich sie auch so früh wie möglich als Zahlen behandeln.
C#-Quelltext
1: 2: 3: 4:
| var lines = File.ReadAllLines(filePath) .Where(line => !string.IsNullOrWhiteSpace(line)) .Select(int.Parse) .ToList(); |
Und nun ist lines eine Liste mit int-Werten.
Die kann dann auch ganz normal sortiert werden.
lukll1 - Mi 03.09.14 10:38
das ist auch ein guter vorschlag, aber leider wird bei mir
lines.Select(int.Parse()) nicht angenommen
es kommt immer fehlermeldung: Keine Überladung für die Parse-methode nimmt 0 Argumente an
und: man soll typargumente explizit angeben
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Mi 03.09.14 10:53
Hallo lukll1,
Palladin007 hat in seinem Code auch
keine Klammern bei der Methode
int.Parse gesetzt.
Select erwartet eine Methode (entweder direkt als Name oder aber z.B. als anonyme Methode oder Lambda-Ausdruck [wie beim
Where(...)).
Auch wenn dir evtl. die beiden letzten Begriffe (noch) nichts sagen werden, so weißt du wenigstens schon mal, daß es so etwas in C# gibt. ;-)
PS. Der Code funktioniert aber nur, wenn auch wirklich nur Zahlen (oder Leerzeilen, welche ausgefiltert werden) vorhanden sind.
Die bessere Methode wäre
TryParse, aber dann muß die
Where-Methode etwas umgeschrieben werden (und der Test auf
IsNullOrWhitespace kann entfallen, da dieser implizit mitgetestet wird):
C#-Quelltext
1:
| Where(line => { int number; return int.TryParse(line, out number); }); |
(hier wird dann zwar jetzt zweimal geparst, aber hier geht ersteinmal Funktionalität vor Performance)
lukll1 - Mi 03.09.14 11:10
was eine methode ist habe ich schon gelernt, lamdaausdruck noch nicht
ja, das habe ich gesehen, habs aber eh selbser geschrieben und nicht reinkopiert, also sind bei mir schon die klammern vorhanden.
nun ja, es sind im texdokument immer eine zahl, dann ein enter und dann unterhalb wieder eine zahl und so weiter
Palladin007 - Mi 03.09.14 11:15
Wenn es garantiert nur Zahlen oder leere Zeilen sind, dann würde ich nicht TryParse nutzen.
Wenn dann doch mal ein falsches Format oder ein Buchstabe drin steht, würde ich das simpel als ungültige Datei weg schieben.
Eine kurze Fehlermeldung und das Abbrechen der angeforderten Funktion, der Nutzer soll doch bitte eine gültige Datei angeben.
Es liegt ja schließlich nicht in der Aufgabe des Entwicklers, die richtigen Daten aus einer beliebigen Datei heraus zu suchen, der Aufwand ist dann schnell sehr groß. In diesem Fall einfach alle gültigen Zahlen raus picken ist noch überschaubar, aber ist in meinen Augen nicht das richtige Vorgehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!