从Console.ReadLine输入中检索数据类型

时间:2016-04-01 07:24:38

标签: c#

我对编程很新,我遇到了挑战,但我需要你的帮助。我的任务是编写一个从控制台读取内容的程序,然后如果它的编号将打印1,如果它的字符串看起来像这样(字符串+ *)。继承我的代码,但有一些错误,我无法弄明白。这是必须使用Switch - Case。

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;
    }        
}  

2 个答案:

答案 0 :(得分:2)

switch case不起作用。它采用您传递的参数数据类型:

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

原样。在您的情况下,x始终为string。 Switch检查参数的,找到该值的设计case检查参数的类型并找到该值的设计case

但是,如果您的目标是检查string可兑换intdoubleDateTime,还是其他一些数据类型,或者只能被视为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

修改

由于必须使用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);

答案 1 :(得分:1)

希望这会有效,现在它可以使用int,double,string我们可以扩展

 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;
            }
        }
    }
}