Autor Beitrag
lukll1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 01.09.14 19:58 
hallo,
ich habe eine if-anweisung programmiert, und weiß aber nicht was falsch ist:

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 02.09.14 11:23 
ok, danke für die info, werde ich gleich mal versuchen
lukll1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
Linie = Linie.OrderBy(x => Convert.ToInt32(x)).ToArray();					
lukll1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Di 02.09.14 17:45 
das funktioniert aber auch nicht...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.09.14 18:08 
Ein vollständiges Beispiel

ausblenden 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
ausblenden Quelltext
1:
2, 3, 3, 5, 15, 17, 19, 29					



Sieht korrekt aus.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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.