.NET - анализирует тип данных без результата - PullRequest
1 голос
/ 15 декабря 2010

Возможно ли проанализировать тип данных (int, double, boolean ...) в .NET без исключения и без возврата результата? Другими словами, я просто хочу иметь возможность ответить на вопрос: «Является ли это действительным целым числом?» или «Это действительный дубль?» без необходимости объявлять переменную результата. Я не хочу использовать .TryParse, потому что мне нужно передать переменную результата, и я не хочу использовать .Parse, потому что он будет выбрасывать.

Есть предложения? (Я был бы удивлен, если бы эта функциональность не присутствовала в .NET, я должен что-то упустить.)

EDIT

Хорошо, это было слишком просто ... только что сделал несколько методов расширения, и я уже в пути ...

    <Extension()> _
    Public Function IsValidInteger(ByVal value As String) As Boolean
        Dim result As Integer
        Return Integer.TryParse(value, result)
    End Function

    <Extension()> _
    Public Function IsValidDouble(ByVal value As String) As Boolean
        Dim result As Double
        Return Double.TryParse(value, result)
    End Function

Похоже, что это дублирующий вопрос, однако, честно говоря, я не нашел этот вопрос до сих пор:

Integer.TryParse - лучший способ?

Принятый ответ на этот вопрос, вероятно, лучше, чем все, что предлагается здесь.

Ответы [ 6 ]

2 голосов
/ 15 декабря 2010

Нет, в фреймворке такой функциональности нет.

Причина в том, что при определении того, является ли строка разборной, по сравнению с ее фактическим анализом, так мало выигрыша, что не стоит использовать оба метода.

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

if (Int32.CanParse(theString)) {
  int n = Int32.Parse(theString);
}

Метод TryParse делает это за одну операцию, и он также работает в очень необычном случае, только с неудобством необходимости объявлять переменную для результата.

2 голосов
/ 15 декабря 2010

Вы можете использовать различные методы TryParse, определенные для типов.

Это лучшее, что вы можете сделать, не написав свой собственный парсер / токенизатор.

1 голос
/ 15 декабря 2010

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

Но если вы действительно хотите, вы можете написать «основанный на соглашении» метод расширения, такой как:

public static class ParseExtensions
{
    public delegate bool TryParser<T>(string input, out T result);

    public static bool CanParseTo<T>(this string text, TryParser<T> tryParser)
    {
        if (text == null)
            throw new ArgumentNullException("text");

        if (tryParser == null)
            throw new ArgumentNullException("tryParser");

        T result;
        return tryParser(text, out result);
    }
}

Использование (жаль, что тип ввода здесь не работает):

bool intTrue = "123".CanParseTo<int>(int.TryParse);
bool intFalse = "xxx".CanParseTo<int>(int.TryParse);

bool enumTrue = "Encrypted".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);
bool enumFalse = "xxx".CanParseTo<FileOptions>(Enum.TryParse<FileOptions>);

bool dateTimeTrue = "2004/05/05".CanParseTo<DateTime>(DateTime.TryParse);
bool dateTimeFalse = "xxx".CanParseTo<DateTime>(DateTime.TryParse);
0 голосов
/ 15 декабря 2010

Попробуйте эту функцию ниже:

public bool isValid<T>(object t)
{
    try
    {
        Convert.ChangeType(t, typeof(T));
        return true;
    }
    catch(Exception e)
    {
        return false;
    }
}

Вам не нужно писать расширение для каждой комбинации базовых типов, потому что этот метод является общим. Пример:

bool isValidInt = isValid<int>("t14");
//isValidInt == false
bool isValidInt2 = isValid<int>("144");
//isValidInt2 == true
0 голосов
/ 15 декабря 2010

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

public static bool IsValidDateFormat(this string s)
{
    DateTime dt;
    return DateTime.TryParse(s, out dt);
}

(может быть, есть немного более элегантный способ сделать это, я просто скомбинировал это для компиляции.)

0 голосов
/ 15 декабря 2010

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

public bool IsValidInt (это int someInt, строка toCheck) {int dontNeed;return Int.TryParse (toCheck, out dontNeed);}

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