2016-04-01 2 views
4

Im довольно новый для программирования, и у меня есть проблема, но мне нужна ваша помощь. Моя задача - написать программу, которая что-то читает с консоли, а затем, если ее номер будет напечатан 1, если ее строка будет выглядеть так (строка + *). Heres мой код, но есть что-то не так, и я не могу понять это. Он должен использовать Switch-Case.Извлечение данных из консоли. Вход в ReadLine

static void Main(string[] args) 
{ 
    string x = Console.ReadLine(); 
    switch (x) 
    { 
     case "int" : 
      int i = int.Parse(x); 
      i = i + 1; 
      Console.WriteLine(i); 
      break; 
     case "double": 
      double d = double.Parse(x); 
      d = d + 1; 
      Console.WriteLine(d); 
      break; 
     case "string": 
      string s = (x); 
      Console.WriteLine(s + "*"); 
      break; 
     default: 
      break; 
    }   
} 
+1

'x.GetType() ToString();. 'Это, как вы можете получить тип' x', но в вашем случае это будет всегда 'String'. – SeM

+1

@SeM: Нет, не нужно - 'x' всегда ссылается на строку или на нуль. –

+1

Я подозреваю, что вы должны посмотреть на 'int.TryParse' и' double.TryParse', считая, что вход действительно будет «это строка», «10», «10,5» и т. Д. –

ответ

2

switch case не работает подобный. Он использует тип данных аргумента, который вы передаете:

string x = Console.ReadLine(); 
switch(x) //x is the argument for switch 

Как есть. В вашем случае x всегда string. Коммутатор проверяет значение аргумента и найти разработанный case для этого значения, он не проверить типа аргумента и найти разработанный case для этого значения.

Но если ваша цель состоит в том, чтобы проверить, если string является конвертируемые в int, double, DateTime, некоторые другие типы данных, или могут быть прочитаны только string, вы должны делать это с TryParse для отдельных типов данных:

int myInt; 
double myDouble; 
bool r1 = int.TryParse(x, out myInt); //r1 is true if x can be parsed to int 
bool r2 = double.TryParse(x, out myDouble); //r2 is true if x can be parsed to double 

Edit:

Поскольку это необходимо использовать switch случай, то вы можете положить ю е приводит к целому числу:

int a = (r1 ? 1 << 1 : 0) + (r2 ? 1 : 0); //0 if string, 1 if int, 2 if double, 3 if int or double 

с использованием концепции bit-flag и сделать switch дело так:

switch (a){ 
    case 0: //string case 
     Console.WriteLine(x + "*"); 
     break; 
    case 1: //int case 
     Console.WriteLine((Convert.ToInt32(x) + 1).ToString()); 
     break; 
    case 2: //double case 
     Console.WriteLine((Convert.ToDouble(x) + 1).ToString()); 
     break; 
    case 3: //int or double case 
     Console.WriteLine((Convert.ToInt32(x) + 1).ToString()); 
     break; 
} 

Оригинал:

Затем вы можете сделать что-то вроде этого:

if (r1){ //parsable to int 
    //do something, like raise the number by 1 
    myInt += 1; 
    x = myInt.ToString();  
} else if (r2){ //parsable to double 
    //do something, like raise the number by 1 
    myDouble += 1; 
    x = myDouble.ToString(); 
} else { //cannot be parsed to any 
    //do something like add `*` 
    x = x + "*"; 
} 
Console.WriteLine(x); 
+0

_with switch - case_ – fubo

+0

Спасибо, мне просто интересно, почему это работает с двойным и строковым, но когда консоль читает целое число, оно не поднимет его с помощью 1? Он должен сделать это, как я вижу код, потому что он тот же, что и двойной ... . Теперь я попробую другой оригинал с «если еще», это выглядит довольно легко .... Я не знаю, почему они просят меня сделать это с футляром для переключателя – Westmafia

+0

О, это работает, извините, я ошибся ... Я не могу ответить сам почему, если я избегу случая 3, он doestn работает? – Westmafia

1

Надеюсь, что это будет работать, потому что теперь он работает с INT, двойной, строки мы можем расширить

public static class Extenstions 
{ 
    public static bool IsValid<T>(this string source) where T : struct 
    { 
     MethodInfo tryParse = (MethodInfo)typeof(T).GetMember("TryParse").FirstOrDefault(); 
     if (tryParse == null) return false; 
     return (bool)tryParse.Invoke(null, new object[] { source, null }); 
    } 
    public static Type GetParsableType(this string source) 
    { 
     return source.IsValid<int>()&&!source.Contains(".") ? typeof(int) : source.IsValid<double>() ? typeof(double) : typeof(string); 

    } 
} 
class Program 
{ 

    static void Main(string[] args) 
    { 
     while (true) 
     { 
      string x = Console.ReadLine(); 
      switch (x.GetParsableType().Name.ToLower()) 
      { 
       case "int32": 
       case "int": 
        int i = int.Parse(x); 
        i = i + 1; 
        Console.WriteLine(i); break; 
       case "double": 
        double d = double.Parse(x); 
        d = d + 1; 
        Console.WriteLine(d); break; 
       case "string": 
        string s = (x); 
        Console.WriteLine(s + "*"); break; 
       default: ; break; 
      } 
     } 
    } 
} 
+0

Спасибо, но это немного сложнее для моего уровня :). В любом случае спасибо! – Westmafia

Смежные вопросы