Я хочу разобрать строку в обнуляемый int в C #. то есть. Я хочу вернуть либо значение int строки, либо null, если его невозможно проанализировать.
Я надеялся, что это сработает
int? val = stringVal as int?;
Но это не сработает, поэтому сейчас я пишу этот метод расширения.
public static int? ParseNullableInt(this string value)
{
if (value == null || value.Trim() == string.Empty)
{
return null;
}
else
{
try
{
return int.Parse(value);
}
catch
{
return null;
}
}
}
Есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ: Спасибо за предложения TryParse, я знал об этом, но это сработало примерно так же. Мне больше интересно знать, есть ли встроенный метод фреймворка, который будет анализировать напрямую в обнуляемый тип int?
Ответы:
int.TryParse
вероятно, немного проще:Редактировать @Glenn
int.TryParse
"встроен в рамки". Это иint.Parse
есть способ разбора строки в Интс.источник
Вы можете сделать это в одну строку, используя условный оператор и тот факт, что вы можете привести
null
к значению типа NULL (две строки, если у вас нет предварительно существующего типа int, вы можете использовать его повторно для выводаTryParse
):Pre C # 7:
Благодаря обновленному синтаксису C # 7, который позволяет объявлять выходную переменную в вызове метода, это становится еще проще.
источник
int.TryParse(val, out i) ? i : default(int?);
[ Обновлено для использования современного C # согласно предложению @ sblom]
У меня была эта проблема, и я закончил с этим (в конце концов, an
if
и 2return
s слишком длинны!):На более серьезном замечании, старайтесь не смешивать
int
, который является ключевым словом C #, сInt32
типом .NET Framework BCL - хотя он работает, он просто делает код неопрятным.источник
int i;
строку и просто продолжайтеreturn int.TryParse (val, out var i) ? (int?) i : null;
int? ParseNInt (string val) => int.TryParse (val, out var i) ? (int?) i : null;
Существует такой подход, который будет анализировать напрямую для обнуляемого типа int (а не только int), если значение допустимо, например, пустая или пустая строка, но выдает исключение для недопустимых значений, поэтому вам нужно будет перехватить исключение и вернуть значение по умолчанию. для таких ситуаций:
Этот подход все еще может использоваться для не обнуляемых разборов, а также обнуляемых:
NB: В преобразователе есть метод IsValid, который можно использовать вместо захвата исключения (сгенерированные исключения приводят к ненужным накладным расходам, если ожидается). К сожалению, он работает только с .NET 4, но есть проблема, при которой он не проверяет ваш языковой стандарт при проверке правильных форматов DateTime, см. Ошибку 93559 .
источник
Источники:
источник
Старая тема, но как насчет:
Мне больше нравится это как требование, где анализировать нуль, версия TryParse не будет выдавать ошибку, например, ToNullableInt32 (XXX). Это может привести к нежелательным тихим ошибкам.
источник
int
, она должна возвращатьnull
, а не выдавать исключение.Попробуй это:
источник
Я чувствую, что мое решение очень чистое и приятное:
Это, конечно, универсальное решение, которое требует, чтобы аргумент универсального метода имел статический метод "Parse (string)". Это работает для чисел, логических, DateTime и т. Д.
источник
Вы можете забыть все остальные ответы - есть отличное общее решение: http://cleansharp.de/wordpress/2011/05/generischer-typeconverter/
Это позволяет вам писать очень чистый код, например так:
а также:
источник
Следующее должно работать для любого типа структуры. Он основан на коде Мэтта Манелы с форумов MSDN . Как указывает Мёрф, обработка исключений может быть дорогой по сравнению с использованием метода TryParse, выделенного для Types.
Это были основные тестовые случаи, которые я использовал.
источник
Я бы предложил следующие методы расширения для разбора строки в значение int с возможностью определения значения по умолчанию в случае, если разбор невозможен:
источник
Это решение является общим без дополнительных затрат.
источник
IsNullOrEmpty
наIsNullOrWhitespace
Нет
источник
Я чувствовал, что должен поделиться своим, который немного более общий.
Использование:
Решение:
Первая версия медленнее, так как требует попытки, но выглядит чище. Если он не будет вызываться много раз с неверными строками, это не так важно. Если производительность является проблемой, обратите внимание, что при использовании методов TryParse необходимо указать параметр типа ParseBy, так как он не может быть выведен компилятором. Мне также пришлось определить делегата, так как ключевое слово out нельзя использовать в Func <>, но по крайней мере на этот раз компилятору не требуется явный экземпляр.
Наконец, вы можете использовать его и с другими структурами, такими как десятичная, DateTime, Guid и т. Д.
источник
Я нашел и адаптировал некоторый код для класса Generic NullableParser. Полный код на моем блоге Nullable TryParse
источник
источник
Вы никогда не должны использовать исключение, если вам не нужно - накладные расходы ужасны.
Варианты TryParse решают проблему - если вы хотите проявить творческий подход (чтобы ваш код выглядел более элегантно), вы, вероятно, могли бы что-то сделать с помощью метода расширения в 3.5, но код был бы более или менее таким же.
источник
Используя делегаты, следующий код может обеспечить возможность многократного использования, если вам понадобится анализируемый разбор для нескольких типов структур. Я показал обе версии .Parse () и .TryParse () здесь.
Это пример использования:
И вот код, который доставит вас туда ...
источник
Я понимаю, что это старая тема, но вы не можете просто:
?
источник
Я придумал этот, который удовлетворял моим требованиям (я хотел, чтобы мой метод расширения как можно ближе эмулировал возвращение TryParse фреймворка, но без блоков try {} catch {} и без жалоб компилятора на вывод обнуляемый тип в методе framework)
источник
Я предлагаю код ниже. Вы можете работать с исключением, когда произошла ошибка преобразования.
Используйте этот метод расширения в коде (заполните int? Возрастное свойство класса person):
ИЛИ
источник