【问题标题】:Retrieve Data-Type from Console.ReadLine input从 Console.ReadLine 输入中检索数据类型
【发布时间】:2016-04-01 15:54:19
【问题描述】:

我对编程很陌生,我遇到了挑战,但我需要你的帮助。我的任务是编写一个程序,它从控制台读取一些东西,然后如果它的数字将打印 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;
    }        
}  

【问题讨论】:

  • x.GetType().ToString(); 这是获取x 类型的方法,但在您的情况下,它将始终为String
  • @SeM:不,不要 - x 始终是对字符串的引用,或者为 null。
  • 我怀疑你应该看看int.TryParsedouble.TryParse,假设输入真的是“这是一个字符串”、“10”、“10.5”等。
  • 我评论了我面前的评论。如果您不希望人们对未完成的想法发表评论,请在发布之前完成它。我们不应该等待 5 分钟,直到您无法再对其进行编辑才能发表评论。
  • @SeM:不,在这种情况下它根本没有用。

标签: c#


【解决方案1】:

switch case 不能这样工作。它采用您传递的参数的数据类型:

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

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

但如果您的目标是检查string 是否可转换intdoubleDateTime、其他一些数据类型,或者只能读取为@987654331 @,您应该使用 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);

【讨论】:

  • 带开关 - 案例
  • 谢谢,我只是想知道为什么它适用于 double 和 string 但是当控制台读取整数时它不会用 1 提升它?它应该这样做,因为我看到代码因为它与 double 相同。 ...现在我将尝试使用“if else”的另一个 Original,它似乎更容易....我不知道他们为什么要求我使用 switch case
  • 哦,它有效,对不起,我犯了一个错误...我无法回答自己,为什么如果我避免第 3 种情况,它不起作用?
  • 我想让你解释一下代码是如何工作的,因为我很难理解它,因为你知道它不仅要复制它,我还想理解它:)
  • @Westmafia 你还有什么问题?您使用if 的情况对吗?
【解决方案2】:

希望这会起作用,现在它适用于我们可以扩展的 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;
            }
        }
    }
}

【讨论】:

  • 谢谢,但这对我的水平来说有点复杂:)。无论如何谢谢!
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2017-12-20
相关资源
最近更新 更多