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