Как использовать int.TryParse с nullable int?

Я пытаюсь использовать TryParse, чтобы узнать, является ли строковое значение целым числом. Если значение является целым числом, пропустите цикл foreach. Вот мой код.

string strValue = "42 "

 if (int.TryParse(trim(strValue) , intVal)) == false
 {
    break;
 }

intVal - это переменная типа int? (nullable INT). Как я могу использовать Tryparse с nullable int?

Ответ 1

Вы не можете сделать это, не используя другую переменную, к сожалению, потому что тип аргументов out должен точно соответствовать параметру.

Как и код Daniel, но фиксированный в терминах второго аргумента, обрезки и избежания сравнений с булевыми константами:

int tmp;
if (!int.TryParse(strValue.Trim(), out tmp))
{
    break;
}
intVal = tmp;

Ответ 2

Здесь опция для nullable int с TryParse

public int? TryParseNullable(string val)
{
    int outValue;
    return int.TryParse(val, out outValue) ? (int?)outValue : null;
}

Ответ 3

Не удалось помешать создать общую версию. Использование ниже.

    public class NullableHelper
    {
        public delegate bool TryDelegate<T>(string s, out T result);

        public static bool TryParseNullable<T>(string s, out T? result, TryDelegate<T> tryDelegate) where T : struct
        {
            if (s == null)
            {
                result = null;
                return true;
            }

            T temp;
            bool success = tryDelegate(s, out temp);
            result = temp;
            return success;
        }

        public static T? ParseNullable<T>(string s, TryDelegate<T> tryDelegate) where T : struct
        {
            if (s == null)
            {
                return null;
            }

            T temp;
            return tryDelegate(s, out temp)
                       ? (T?)temp
                       : null;
        } 
    }


bool? answer = NullableHelper.ParseNullable<bool>(answerAsString, Boolean.TryParse);

Ответ 4

Вы можете создать вспомогательный метод для анализа значения с нулевым значением.

Пример использования:

int? intVal;
if( !NullableInt.TryParse( "42", out intVal ) )
{
    break;
}

Помощник:

public static class NullableInt
{
    public static bool TryParse( string text, out int? outValue )
    {
        int parsedValue;
        bool success = int.TryParse( text, out parsedValue );
        outValue = success ? (int?)parsedValue : null;
        return success;
    }
}

Ответ 5

Вы также можете сделать метод расширения для этой цели;

public static bool TryParse(this object value, out int? parsed)
{
    parsed = null;
    try
    {
        if (value == null)
            return true;

        int parsedValue;
        parsed = int.TryParse(value.ToString(), out parsedValue) ? (int?)parsedValue : null;
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

Я сделал это расширение для типа object, но он мог также быть на string. Лично мне нравятся эти расширители парсеров для любого объекта, следовательно расширение на object вместо string.

Пример использования:

[TestCase("1", 1)]
[TestCase("0", 0)]
[TestCase("-1", -1)]
[TestCase("2147483647", int.MaxValue)]
[TestCase("2147483648", null)]
[TestCase("-2147483648", int.MinValue)]
[TestCase("-2147483649", null)]
[TestCase("1.2", null)]
[TestCase("1 1", null)]
[TestCase("", null)]
[TestCase(null, null)]
[TestCase("not an int value", null)]
public void Should_parse_input_as_nullable_int(object input, int? expectedResult)
{
    int? parsedValue;

    bool parsingWasSuccessfull = input.TryParse(out parsedValue);

    Assert.That(parsingWasSuccessfull);
    Assert.That(parsedValue, Is.EqualTo(expectedResult));
}

Недостатком было бы то, что это нарушает синтаксис фреймворка для синтаксического анализа значений;

int.TryParse(input, out output))

Но мне нравится более короткая версия (более читаемая или нет, может быть предметом обсуждения);

input.TryParse(out output)