如何从几种检测到的数据中选择一种正确的数据类型

时间:2019-02-15 09:22:01

标签: c# .net

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

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

例如,如果检测到至少一个字符串,则将默认数据类型定义为字符串,因为该类型还可以“存储”其他数据类型,例如bool或date。

名称

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

list<object> tt

在循环中使用:

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

答案 2 :(得分:0)

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

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