Autor |
Beitrag |
lukll1
      
Beiträge: 22
|
Verfasst: Mo 01.09.14 19:58
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: Di 02.09.14 11:23
ok, danke für die info, werde ich gleich mal versuchen
|
|
lukll1 
      
Beiträge: 22
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: Di 02.09.14 17:45
das funktioniert aber auch nicht...
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: Di 02.09.14 17:52
ja dass ist mir schon klar
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 22
|
Verfasst: 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
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: 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.
|
|