C # сомневаюсь, находя тип данных - PullRequest
1 голос
/ 03 марта 2009

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

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

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

str1 - целое число
str2 - строка
стр3 - двухместный
str4 - char

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

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

Ответы [ 5 ]

8 голосов
/ 03 марта 2009

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

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

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

7 голосов
/ 03 марта 2009

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

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

Две вещи

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

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

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

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

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

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

3 голосов
/ 03 марта 2009

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

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);
3 голосов
/ 03 марта 2009

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

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

3 голосов
/ 03 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...