Подтвердить что ты не робот

Элегантный TryParse

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

int value;
if (!int.TryParse(someStringValue, out value)
  value = 0;

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

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

4b9b3361

Ответ 1

Это действительно, и вы можете предпочесть его, если у вас есть симпатия к одиночным лайнерам:

int i = int.TryParse(s, out i) ? i : 42;

Это устанавливает значение i в 42, если он не может разобрать строку s, в противном случае она устанавливает i = i.

Ответ 2

как насчет метода прямого расширения?

public class Extensions
{
    public static int? TryParse(string this Source)
    {
        if(int.tryparse .... 
    }

}

использование:

v = "234".TryParse() ?? 0

Ответ 3

Вы можете написать свои собственные методы для решения, которое вам подходит. Я наткнулся на класс Maybe, который обменивает методы TryParse некоторое время назад.

int? value = Maybe.ToInt("123");

if (value == null)
{
    // not a number
}
else
{
    // use value.Value
}

или укажите значение по умолчанию в строке:

int value = Maybe.ToInt("123") ?? 0;

Наблюдайте различие между Nullable<int>/int? и int.

Подробнее о http://www.kodefuguru.com/post/2010/06/24/TryParse-vs-Convert.aspx

Ответ 4

В С# 6 есть С# 7, выражения выражения, поэтому в С# 7 вместо

int x;
if (int.TryParse("123", out x))
{
  DoSomethingWithX(x);
}

мы можем использовать:

if (int.TryParse("123", out int x))
{
  DoSomethingWithX(x);
}

Приятно для меня:)

Ответ 5

Вместо этого вы можете использовать TypeDescriptor:

public T Convert<T>(string input, T defaultVal)
{
    var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T));
    if(converter != null)
    {
        return (T)converter.ConvertFromString(input);
    }
    return defaultVal;
}

public T Convert<T>(string input)
{
    return Convert(input, default(T));
}

Вы можете ограничить T структурой и использовать Nullable также (в соответствии с ответом @skarmats).

Ответ 6

В вашем конкретном примере вы можете сделать это:

int value; 
int.TryParse(someStringValue, out value);

... потому что Int32.TryParse() задокументирован как параметр value=0, если он не выполняет синтаксический анализ.

Ответ 7

Это один из приятных сюрпризов для разработчиков С#, которые пытаются использовать F #. Метод TryParse возвращает кортеж, содержащий как bool, так и значение.