C# C语言中字符串数组解析的数据类型识别#

C# C语言中字符串数组解析的数据类型识别#,c#,parsing,type-conversion,C#,Parsing,Type Conversion,是否有一个库可以帮助识别给定字符串数组中的数据类型,例如 {"1.0", "2.0", "3.0"} ==> float, double, decimal (I do not care as long it is a real number) {"1.0", "AB", "A"} ==> string {1, 2, 3, 4} ==> Int32 {1.0, 2.5, 1, 2, 3} ==> float/double/decimal 识别给定类型的最小表示形式

是否有一个库可以帮助识别给定字符串数组中的数据类型,例如

{"1.0", "2.0", "3.0"} ==>  float, double, decimal (I do not care as long it is a real number)

{"1.0", "AB", "A"} ==> string

{1, 2, 3, 4} ==> Int32

{1.0, 2.5, 1, 2, 3} ==> float/double/decimal
识别给定类型的最小表示形式(例如,float代替double或short代替int)是一种优势,但不是必要的

需要识别的一些附加数据类型:DateTime(可能的格式很少),+/-符号表示前缀或后缀,小数点表示为点或逗号,等等


我需要创建一个类似于Excel导入向导的功能,其中输入时我有一个csv文本文件,系统应该为每个列建议数据类型。

我认为最好的方法是从“最小”到“最大”转换到所需的每种可能类型。大概是这样的:

IList<object> dataTypeArr = new  List<object> 
{
    1.0, 
    "AB", 
    "A",
    DateTime.Now
};

var typeList2 = new List<object>();
foreach (var item in dataTypeArr)
{
    typeList2.Add(item.GetType());
}
void SetColumnType(string inputString)
{
    bool boolValue;
    short shortValue;
    int intValue;
    float floatValue;

    if (bool.TryParse(inputString, out boolValue))
    {
        // set that column type or whatever to int
    }
    else if (short.TryParse(inputString, out shortValue))
    {
        // ... to short
    }
    else if (int.TryParse(inputString, out intValue))
    {
        // ... to int
    }
    else if (float.TryParse(inputString, out floatValue))
    {
        // ... to float
    }

    // ... etc.
}

如果要将这些值转换为它们必须精确的表示形式,则需要存储它们并将它们返回给调用者,调用者将是
object
类型数组,而我们没有完成任何操作。您可以依次对更多“常规”类型(short->int->float->double,比方说)执行一系列
TryParse
直到您找到一个成功的,并且如果没有一次尝试成功,则返回字符串。@OrelEraki,是的,我知道这一点,但我可以存储类型,然后在代码中使用它。搜索句点,如果有,那么我们有一个float/double if not检查它是否是数字…如果是,那么我们有一个整数,如果不是字符串。@SebastianWidz如果你将数组转换成一个列表,这可以完成,然后从那里你可以确定列表中每个元素的数据类型。我上周刚刚发布了一个例子,我将调整我的答案以适用当您无法将
字符串[]转换为字符串
时,您所有的示例都显示了这一点。。?您不应该发布不起作用的代码,特别是当OP明确询问
{}
字符串数组时,然后遍历字符串数组。这不是一个好例子。也许您应该编辑它并确保它起作用
void SetColumnType(string inputString)
{
    bool boolValue;
    short shortValue;
    int intValue;
    float floatValue;

    if (bool.TryParse(inputString, out boolValue))
    {
        // set that column type or whatever to int
    }
    else if (short.TryParse(inputString, out shortValue))
    {
        // ... to short
    }
    else if (int.TryParse(inputString, out intValue))
    {
        // ... to int
    }
    else if (float.TryParse(inputString, out floatValue))
    {
        // ... to float
    }

    // ... etc.
}