Gle*_*ven 288 .net c# string nullable .net-3.5
我想在C#中将字符串解析为可以为空的int.即.我想要返回字符串的int值,如果无法解析,则返回null.
我有点希望这会奏效
int? val = stringVal as int?;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,所以我现在这样做的方式是我写了这个扩展方法
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
编辑: 感谢TryParse的建议,我确实知道这一点,但它的结果大致相同.我更感兴趣的是知道是否有一个内置的框架方法可以直接解析为可以为空的int?
Mat*_*ton 344
int.TryParse 可能有点容易:
public static int? ToNullableInt(this string s)
{
int i;
if (int.TryParse(s, out i)) return i;
return null;
}
Run Code Online (Sandbox Code Playgroud)
编辑 @Glenn int.TryParse"内置于框架中".它int.Parse是将字符串解析为int的方法.
McK*_*eG1 166
您可以使用条件运算符和可以null转换为可空类型的事实在一行中执行此操作(两行,如果您没有预先存在的int,则可以重用输出TryParse):
前C#7:
int tempVal;
int? val = Int32.TryParse(stringVal, out tempVal) ? Int32.Parse(stringVal) : (int?)null;
Run Code Online (Sandbox Code Playgroud)
使用C#7的更新语法,您可以在方法调用中声明输出变量,这甚至更简单.
int? val = Int32.TryParse(stringVal, out var tempVal) ? tempVal : (int?)null;
Run Code Online (Sandbox Code Playgroud)
Duc*_*boy 33
抱歉,无法抗拒 - 有这个问题,谷歌把我带到了这里,但我最终得到了这个(毕竟,if和2 返回 s太啰嗦了!):
int? ParseNInt (string val)
{
int i;
return int.TryParse (val, out i) ? (int?) i : null;
}
Run Code Online (Sandbox Code Playgroud)
更严重的是,尽量不要将int(这是一个C#关键字)与Int32(一种.NET Framework BCL类型)混合使用 - 尽管它有效,但它只会让代码看起来很乱.
Mic*_*ael 15
Glenn Slaven:我更想知道是否有一个内置的框架方法可以直接解析为可以为空的int?
如果值有效(如null或空字符串),则此方法将直接解析为可空int(而不仅仅是int),但会为无效值引发异常,因此您需要捕获异常并返回默认值对于那些情况:
public static T Parse<T>(object value)
{
try { return (T)System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value.ToString()); }
catch { return default(T); }
}
Run Code Online (Sandbox Code Playgroud)
这种方法仍然可以用于非可空的解析以及可以为空的:
enum Fruit { Orange, Apple }
var res1 = Parse<Fruit>("Apple");
var res2 = Parse<Fruit?>("Banana");
var res3 = Parse<int?>("100") ?? 5; //use this for non-zero default
var res4 = Parse<Unit>("45%");
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用转换器上的IsValid方法而不是捕获异常(如果需要,抛出的异常会导致不必要的开销).不幸的是它只能用于.NET 4,但是在验证正确的DateTime格式时它仍然没有检查你的语言环境的问题,参见bug 93559.
Jaa*_*a H 10
var result = int.TryParse(foo, out var f) ? f : default(int?);
Run Code Online (Sandbox Code Playgroud)
资料来源:
试试这个:
public static int? ParseNullableInt(this string value)
{
int intValue;
if (int.TryParse(value, out intValue))
return intValue;
return null;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
老话题,但怎么样:
public static int? ParseToNullableInt(this string value)
{
return String.IsNullOrEmpty(value) ? null : (int.Parse(value) as int?);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢这个作为解析null的请求,TryParse版本不会在例如ToNullableInt32(XXX)上抛出错误.这可能会引入有害的无声错误.
小智 5
我觉得我的解决方案是一个非常干净而且不错的解决方案:
public static T? NullableParse<T>(string s) where T : struct
{
try
{
return (T)typeof(T).GetMethod("Parse", new[] {typeof(string)}).Invoke(null, new[] { s });
}
catch (Exception)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这是一个通用解决方案,仅要求generics参数具有静态方法“ Parse(string)”。这适用于数字,布尔值,日期时间等。
您可能会忘记所有其他答案-有一个很好的通用解决方案:http : //cleansharp.de/wordpress/2011/05/generischer-typeconverter/
这使您可以编写非常干净的代码,如下所示:
string value = null;
int? x = value.ConvertOrDefault();
Run Code Online (Sandbox Code Playgroud)
并且:
object obj = 1;
string value = null;
int x = 5;
if (value.TryConvert(out x))
Console.WriteLine("TryConvert example: " + x);
bool boolean = "false".ConvertOrDefault();
bool? nullableBoolean = "".ConvertOrDefault();
int integer = obj.ConvertOrDefault();
int negativeInteger = "-12123".ConvertOrDefault();
int? nullableInteger = value.ConvertOrDefault();
MyEnum enumValue = "SecondValue".ConvertOrDefault();
MyObjectBase myObject = new MyObjectClassA();
MyObjectClassA myObjectClassA = myObject.ConvertOrDefault();
Run Code Online (Sandbox Code Playgroud)