Вопрос

У меня есть следующие переменные:

string str1 = "1";
string str2 = "asd";
string str3 = "3.5";
string str4 = "a";

Теперь мне нужно найти тип данных каждой строки, т.е.тип данных, в который они могут быть преобразованы, если убрать кавычки.Вот во что я хотел бы преобразовать каждую переменную:

str1 - целое число
str2 - строка
str3 - двойной
str4 - символ

Примечание:если строка содержит один символ, она должна быть char, хотя строка может содержать одну букву, я ограничиваю это.

К ТВОЕМУ сведению:эти значения получены из DataGrid, где я вручную ввел значения.Таким образом, все превращается в цепочку.Есть ли какой-нибудь способ сделать это?

Это было полезно?

Решение

Использовать метаданные, если ты сможешь

То, что вы должны угадывать, что это за типы данных, - не очень хорошая идея.

Две вещи

1 Откуда поступают данные?

Если это база данных, вы уверены, что это строки?Если это база данных, должны быть возвращены некоторые метаданные, которые расскажут вам, каковы типы данных полей.

Если это Xml-файл, определена ли схема, которая предоставит вам типы?

2. Если вам нужно продолжать гадать.

Имейте в виду, что у вас могут быть строки, которые могут быть числами, но являются вполне допустимыми строками, например, номерами телефонов, номерами банковских счетов, которые лучше всего выразить в виде строк.Также эти числа могут содержать много цифр, если вы преобразуете их в двойные, вы можете потерять некоторые цифры из-за неточностей с плавающей запятой (у вас должно быть в порядке до 14 или 15 цифр).

Я уверен, что к настоящему времени - потому что я не торопился печатать это - есть много ответов, рассказывающих вам, как это сделать (т. Е.сначала попробуйте проанализировать int, затем double, затем проверьте длину для char, если нет, то это строка и т.д.), Но на вашем месте я бы постарался этого НЕ делать и посмотрел, есть ли какой-нибудь способ получить или передать некоторые метаданные, которые подскажут вам, какой это тип ЯВЛЯЕТСЯ и не только то, что это за тип мог бы быть

Другие советы

Конечно, определенного способа сделать это нет, но если вы создадите список типов данных, которые хотите проверить, упорядоченных по приоритету, то что-то вроде этого может сработать.

object ParseString(string str)
{
    int intValue;
    double doubleValue;
    char charValue;
    bool boolValue;

    // Place checks higher if if-else statement to give higher priority to type.
    if (int.TryParse(str, out intValue))
        return intValue;
    else if (double.TryParse(str, out doubleValue))
        return doubleValue;
    else if (char.TryParse(str, out charValue))
        return charValue;
    else if (bool.TryParse(str, out boolValue))
        return boolValue;

    return null;
}

Просто вызовите эту функцию для каждой строки, и вам должен быть возвращен соответствующий тип объекта.Затем простая проверка типа может рассказать вам, как была проанализирована строка.

Используйте TryParse метод каждого типа.

Встроенного способа сделать это нет, вы могли бы попытаться выполнить TryParse для числовых типов с большей точностью, но это не гарантировало бы, что это будет правильно.

Лучше всего было бы обработать это так, как вы сделали бы вручную.т. е.Есть ли десятичный знак?Нет - тогда это целое число.Насколько большой?Это отрицательный результат?

Типом данных для каждого из этих элементов является string .Если вы хотите попытаться разобрать их на разные типы, вы можете использовать Int32.TryParse, Double .TryParse и т.д.Или вы можете использовать регулярное выражение:

bool isInt = new Regex(@"^\d+$").IsMatch(str);
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+$").IsMatch(str);
bool isChar = !(isInt || isDouble) && new Regex(@"^.$").IsMatch(str);
bool isString = !(isInt || isDouble || isChar);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top