我觉得每次使用TryParse
时都会导致代码有点丑陋。主要是我这样使用它:
int value;
if (!int.TryParse(someStringValue, out value))
{
value = 0;
}
是否有一些更优雅的解决方案来解析所有基本数据类型,具体是否有办法在一行中进行故障安全解析?如果失败安全,我假设如果解析失败而没有例外,则设置默认值。
顺便说一下,即使解析失败,我也必须做一些动作,只使用默认值。
答案 0 :(得分:113)
这是有效的,如果你喜欢单行,你可能更喜欢它:
int i = int.TryParse(s, out i) ? i : 42;
如果无法解析字符串i
,则会将42
的值设置为s
,否则会设置i = i
。
答案 1 :(得分:18)
直接扩展方法怎么样?
public class Extensions
{
public static int? TryParse(string this Source)
{
if(int.tryparse ....
}
}
用法:
v = "234".TryParse() ?? 0
答案 2 :(得分:15)
您可以编写自己的方法,以获得更适合您的解决方案。我偶然发现了包含Maybe
方法的TryParse
类。
int? value = Maybe.ToInt("123");
if (value == null)
{
// not a number
}
else
{
// use value.Value
}
或指定默认值in-line:
int value = Maybe.ToInt("123") ?? 0;
观察Nullable<int>
/ int?
和int
之间的区别。
有关详细信息,请参阅http://www.kodefuguru.com/post/2010/06/24/TryParse-vs-Convert.aspx
答案 3 :(得分:12)
在
int x;
if (int.TryParse("123", out x))
{
DoSomethingWithX(x);
}
我们可以使用:
if (int.TryParse("123", out int x))
{
DoSomethingWithX(x);
}
对我来说足够好了:))
答案 4 :(得分:2)
您可以改为使用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的回答)。
答案 5 :(得分:2)
在您的特定示例中,您可以执行此操作:
int value;
int.TryParse(someStringValue, out value);
...因为如果解析失败,Int32.TryParse()被记录为设置value=0
。
答案 6 :(得分:0)
对于尝试使用F#的C#开发人员来说,这是一个不错的惊喜。 TryParse方法返回一个包含bool和值的元组。
答案 7 :(得分:0)
在单行中使用C#7
int.TryParse(s, out var i) ? i : (int?)null;
示例方法:
public static int? TryParseSafe(string s)
{
return int.TryParse(s, out var i) ? i : (int?)null;
}