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

Int.TryParse синтаксический сахар

int.TryPrase отлично и все, но есть только одна проблема... для использования требуется как минимум две строки кода:

int intValue;
string stringValue = "123";
int.TryParse(stringValue, out intValue);
....

Конечно, я могу сделать что-то вроде:

string stringValue = "123";
int intValue = Convert.ToInt32(string.IsNullOrWhiteSpace(stringValue) ? 0 : stringValue); 

только на одной строке кода.

Как я могу выполнить некоторую магию, чтобы заставить int.TryParse использовать один лайнер, или есть еще третья альтернатива?

Спасибо!

Безден ответил на вопрос лучше, но на самом деле я планирую использовать решение Reddogs.

4b9b3361

Ответ 1

int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;

Ответ 2

Возможно использование метода расширения:

public static class StringExtensions
{
    public static int TryParse(this string input, int valueIfNotConverted)
    {
        int value;
        if (Int32.TryParse(input, out value))
        {
            return value;
        }
        return valueIfNotConverted;
    }
}

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

string x = "1234";
int value = x.TryParse(0);

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

Ответ 3

Этот ответ только для тех, кто использует хотя бы С# 7.

Теперь вы можете объявить параметр out встроенным.

int.TryParse("123", out var result);

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

if (int.TryParse("123", out var result)) {
    //do something with the successfully parsed integer
    Console.WriteLine(result);
} else {
    Console.WriteLine("That wasn't an integer!");
}

MSDN: https://docs.microsoft.com/de-de/dotnet/csharp/whats-new/csharp-7#out-variables

Ответ 4

Я бы создал метод расширения из этого.

    public static int? AsInt32(this string s)
    {
        int value;
        if (int.TryParse(s, out value))
            return value;

        return null;
    }

Ответ 5

Я не думаю, что есть что-то действительно красивое, но если вам это нравится, вы получите его в одну строку:

string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;

Ответ 6

Ознакомьтесь с классом StringExtensions. Он содержит метод расширения AsInt (String, Int32), который будет пытаться преобразовать строку, и если неуспешно заполнить его с указанным значением Int32 по умолчанию.

Пример:

var intValue = "123".AsInt(-1);

Ответ 7

Вы не хотите делать int.TryParse() одной строкой. Зачем? Поскольку вы не можете назначить intValue, если строка ввода не является допустимым целым числом. Вся точка TryParse() - это позволить вам проверить хороший ввод и грамотно деградировать, вместо того, чтобы поймать исключение.

Int.TryParse() уже является ярлыком, поэтому вам не нужно тестировать действительный int и выполнять задание в два этапа... что, насколько вы хотите его принять.

Ответ 8

Поскольку он по существу возвращает два значения (успех и значение), нам действительно нужны две строки.

Вы можете попробовать класс оболочки, то есть:

void Main()
{
    var result = simpleIntParser.TryParse("1");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }

    result = simpleIntParser.TryParse("a");
    if(result)
    {
        Console.WriteLine((int)result);
    } else {
        Console.WriteLine("Failed");
    }


}

public class simpleIntParser
{
    public bool result {get; private set;}
    public int value {get; private set;}

    private simpleIntParser(bool result, int value)
    {
        this.result = result;
        this.value = value;
    }

    public static simpleIntParser TryParse(String strValue)
    {
        int value;
        var result = int.TryParse(strValue, out value);
        return new simpleIntParser(result, value);
    }

    public static implicit operator int(simpleIntParser m)
    {
        return m.value;
    }

    public static implicit operator bool(simpleIntParser m)
    {
        return m.result;
    }
}

Требуется листинг, если тип неоднозначен (т.е. для Console.WriteLine()), но если вы передаете его как целочисленный параметр, например, не требуется кастинг

Ответ 9

int val2 = "asd".AsInt(-1); 
//Output : -1
 int val3 = "123".AsInt(-1); 
//Output : 123

У вас должно быть пространство имен System.Web.WebPages.