【问题标题】:How to choose one right data type from several detected如何从检测到的几种数据类型中选择一种正确的数据类型
【发布时间】:2019-02-15 19:47:36
【问题描述】:

我正在解决一个问题。我有一个检测到的数据类型(“int”、“double”、“string”、“bool”、“datetime”、“timespan”、“datetimeoffset”)的list<string>

现在我需要选择一种类似于“默认”的数据类型,它将用于数组中的所有值。如何创建(理论上)设置适当数据类型的逻辑?

例如,如果检测到至少一个字符串,默认数据类型将被定义为字符串,因为这种类型也可以“存储”其他数据类型,例如布尔或日期。

名字

【问题讨论】:

  • 欢迎来到 Stack Overflow。我不清楚您是在寻求帮助以制定要应用的正确规则,还是实施这些规则。无论哪种方式,我们都需要更多信息……例如,是什么阻止您总是使用字符串?你有什么标准?
  • 使用列表.
  • 对此没有单一的正确答案,因为这完全取决于您实际想要达到的目标。一般来说,猜测数据类型,或尝试选择“最通用的类​​型,但不是太通用”不可避免地会在某个地方以某种方式导致错误。你处理这些错误的策略是什么,为什么你不总是应用它而不是一开始就猜测?谁或什么在使用数组,他们需要什么?
  • 我试图找到一种方法来检测最可能的数据类型。当您插入一个值程序时,类似于 Excel 中的东西会决定它是一个字符串、一个数值还是一个日期......
  • Excel 实际上有点糟糕(尽管这不是它的错)。例如,当它无法将“2018-01-01”视为日期时,我一直很生气,因为系统使用了不同的语言环境。或者当它必须猜测“01-02-2018”是一月还是二月时,猜错了。不要让我开始使用小数分隔符——不,“12,34”不是“12,340”。 0, 1, 0, 0, 0bool 的列表还是int 的列表?你想让我写false, true, false, false, false吗?幸运的是 Excel 允许我覆盖格式...

标签: c# .net


【解决方案1】:

如果我正确理解你想要什么,你可以做一个这样的方法:

public static List<object> GetMostLikelyType(List<string> inputs)
{
    List<object> result = new List<object>() ;
    int num;
    double d;
    DateTime dt;
    bool b;
    TimeSpan ts;
    DateTimeOffset dto;
    if (inputs.All(i => int.TryParse(i, out num)))
        result = inputs.Select(x => (object)int.Parse(x)).ToList();
    else if (inputs.All(i => double.TryParse(i, out d)))
        result = inputs.Select(x => (object)double.Parse(x)).ToList();
    else if (inputs.All(i => DateTime.TryParse(i, out dt)))
        result = inputs.Select(x => (object)DateTime.Parse(x)).ToList();
    else if (inputs.All(i => bool.TryParse(i, out b)))
        result = inputs.Select(x => (object)bool.Parse(x)).ToList();
    else if (inputs.All(i => TimeSpan.TryParse(i, out ts)))
        result = inputs.Select(x => (object)TimeSpan.Parse(x)).ToList();
    else if (inputs.All(i => DateTimeOffset.TryParse(i, out dto)))
        result = inputs.Select(x => (object)DateTimeOffset.Parse(x)).ToList();
    else
        result = inputs.Select(x => (object)x.ToString()).ToList();
    return result;
}

然后将其用于您的 List(对相应的输出进行注释):

List<string> strings = new List<string>() {"2016/7/3","2025/12/01" };
//List of DateTime objects
List<string> strings2 = new List<string>() { "25", "21.12" };
//List of Double objects
List<string> strings3 = new List<string>() { "true", "false" };
//List of bool objects
List<string> strings4 = new List<string>() { "12", "0" };
//List of int objects
List<string> strings5 = new List<string>() { (new TimeSpan(2,3,3)).ToString(), "0" };
//List of TimeSpan objects
List<string> strings6 = new List<string>() { "2016/7/3" , "3"};
//string

var result = GetMostLikelyType(strings);
var result2 = GetMostLikelyType(strings2);
var result3 = GetMostLikelyType(strings3);
var result4 = GetMostLikelyType(strings4);
var result5 = GetMostLikelyType(strings5);
var result6 = GetMostLikelyType(strings6);

【讨论】:

    【解决方案2】:

    您可以将所有内容声明为对象,因为对象是所有内容的基本类型。

    然后您遍历列表并使用 typeof 进行测试。

    list<object> tt
    

    在你的循环中使用:

     if (tt[I].GetType() == typeof(Integer))
    

    【讨论】:

      【解决方案3】:

      我更喜欢使用对象列表或动态列表:

      List<object> stuff = new List<object>();
      
      stuff.add("test");
      stuff.add(35);
      
      Console.WriteLine((string)stuff[0]);
      Console.WriteLine((int)stuff[1]);
      

      这里是动态示例:

      var list = new List<dynamic>();
      list.Add(123);
      list.Add(new
      {
      Name = "Lorem Ipsum"
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2011-02-12
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多