Как использовать 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)