Entwickler-Ecke

C# - Die Sprache - Inhalt eines Strings in verschiedene Datentypen verteilen


coolace - Mo 21.04.08 20:03
Titel: Inhalt eines Strings in verschiedene Datentypen verteilen
Hallo erstmal,

hab dieses wunderschöne Forum auf der Suche nach Hilfe gefunden :-)
Folgendes, ich muss mich im Sinne meines Studiums mit C# beschäftigen
und bekomme folgende Aufgabe nicht hin.
Zitat:
Dem Programm werden beliebige Zahlen als Kommandozeilenparameter übergeben, es speichert ganze Zahlen (aus dem int-Bereich) in einem int -Feld i1, Zahlen aus dem long-bereich in einem long-Feld l1; Kommazahlen in einem double Feld l1. Ungültige Zahlenformate werden nicht gespeichert.

Das heißt für mich ich bekomme meine Werte als String übergeben, finde
aber keine passende Methode den Inhalt auf diese Datentypen zu überprüfen.
Wer könnte mir gedankentechnisch einen Schubs in die richtige Richtung geben.

Gruß

Coolace

Moderiert von user profile iconNarses: Quote-Tags hinzugefügt


Kha - Mo 21.04.08 20:23

Du kannst jeden der Datentypen "versuchsweise" mit seiner statischen TryParse-Methode einlesen und bei einem Fehler mit dem nächsten Typ fortfahren. Jetzt musst du dir nur noch eine sinnvolle Reihenfolge überlegen ;) .

Achja: Wenn mehrere Zahlen gleichzeitig übergeben werden können, würde ich den Input erst per String.Split an den Leerzeichen auftrennen.


bakachan - Di 22.04.08 07:06

Zitat:
als Kommandozeilenparameter übergeben

Deine Werte werden dir als String-Array übergeben.
Je nachdem wie musst du sie eventuell erst noch splitten (String.Split oder RegEx).
Danach würd ich sagen machst du dir 3 Listen oder Felder (1 int, 1 long, 1 double) und je nach Datenbereich (also wenn TryParse true zurückgibt) ordnest du zu.


coolace - Di 22.04.08 15:53

Hy,

vielen vielen Dank für eure Antwort, das ist nun herausgekommen aber das Programm stürzt nach dem Ausführen aus

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
using System;
using System.Collections.Generic;
using System.Text;

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
            
            int[] izahlen = new int[args.Length];
            long[] lzahlen = new long[args.Length];
            double[] dzahlen = new double[args.Length];
                     

            for (int i=0; i<=args.Length; i++)
            {
                try
                {
                    izahlen[i] = Convert.ToInt16(args);
                }
                catch (FormatException)
                {

                    try
                    {
                        lzahlen[i] = Convert.ToInt64(args);
                    }
                    catch (FormatException)
                    {

                        try
                        {
                            dzahlen[i] = Convert.ToDouble(args);
                        }
                        catch (FormatException)
                        {
                            Console.WriteLine("\nUngültiges Zahlen Format");
                        }
                    }
                }
              

            }
            for (int i = 0; i <= args.Length; i++)
            {
                Console.WriteLine("\nElement:"+i+izahlen[i]);
                Console.WriteLine("\nElement:" + i + lzahlen[i]);
                Console.WriteLine("\nElement:" + i + dzahlen[i]);
            }
        }
    }
}


Danke und Gruß

Coolace

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


bakachan - Di 22.04.08 15:57

Benutze anstelle von Convert lieber TryParse dann stürzt es auch nicht ab wenn der Datentyp nicht passt


coolace - Di 22.04.08 16:28

das war aber meine Überlegung das er falsche Formate erkennt um im catch block dann entsprechend wenns passt zurodnet oder hab ich da was falsch verstanden ?


JüTho - Di 22.04.08 16:56

Deshalb ist ein Blick in die SDK-Doku immer nützlich: Dort steht nämlich, was TryParse ist und macht:
Zitat:
Konvertiert die Zeichenfolgendarstellung einer Zahl in die entsprechende 32-Bit-Ganzzahl mit Vorzeichen. Ein Rückgabewert gibt an, ob die Operation erfolgreich abgeschlossen wurde.

Rückgabewert -> Erfolg oder nicht!

Jürgen


Kha - Di 22.04.08 18:22

Ich habe mich ja schon oben für TryParse ausgesprochen, aber grundsätzlich ist doch nichts gegen seine Methode einzuwenden (wäre eben der 1.1-Weg ;) ). Eine Fehlermeldung wäre allerdings schöner als "stürzt ab".
Zwei Tipps: Die Schleifen laufen zu weit, außerdem wirst du am Ende ziemlich viele Nullen in den Arrays haben - ich würde lieber drei Listen (List<T>) benutzen und diese per Add füllen.


coolace - Mi 23.04.08 17:08

Hy,

vielen vielen Dank an alle die mir geholfen haben, jetzt funktioniert es. Mit Tryparse ist es sicherlich eleganter aber ich hab meinen Fehler gefunden der eigentlich nicht passieren darf

static void Main(string[] args) // dies liefert ein Charakter Feld zurück und ich hab in der Schleife die Geschichte nicht mit einem Indexzähler versehen, mit args[i] klappts

Dafür hab ich aber Tryparse kennengelernt und werde in Zukunft das verwenden.

Schönen Tag und Gruß

CoolAce