Ответ 1
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
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.
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
Возможно использование метода расширения:
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);
Изменить. И, конечно же, вы можете добавить очевидную перегрузку, которая уже устанавливает значение по умолчанию равным нулю, если это ваше желание.
Этот ответ только для тех, кто использует хотя бы С# 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
Я бы создал метод расширения из этого.
public static int? AsInt32(this string s)
{
int value;
if (int.TryParse(s, out value))
return value;
return null;
}
Я не думаю, что есть что-то действительно красивое, но если вам это нравится, вы получите его в одну строку:
string stringValue = "123"
int intValue = int.TryParse(stringValue, out intValue) ? intValue : 0;
Ознакомьтесь с классом StringExtensions. Он содержит метод расширения AsInt (String, Int32), который будет пытаться преобразовать строку, и если неуспешно заполнить его с указанным значением Int32 по умолчанию.
Пример:
var intValue = "123".AsInt(-1);
Вы не хотите делать int.TryParse() одной строкой. Зачем? Поскольку вы не можете назначить intValue, если строка ввода не является допустимым целым числом. Вся точка TryParse() - это позволить вам проверить хороший ввод и грамотно деградировать, вместо того, чтобы поймать исключение.
Int.TryParse() уже является ярлыком, поэтому вам не нужно тестировать действительный int и выполнять задание в два этапа... что, насколько вы хотите его принять.
Поскольку он по существу возвращает два значения (успех и значение), нам действительно нужны две строки.
Вы можете попробовать класс оболочки, то есть:
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()), но если вы передаете его как целочисленный параметр, например, не требуется кастинг
int val2 = "asd".AsInt(-1);
//Output : -1
int val3 = "123".AsInt(-1);
//Output : 123
У вас должно быть пространство имен System.Web.WebPages
.