如何使用int.TryParse与可空int?
我正在尝试使用TryParse来查找string值是否是一个整数。 如果该值是一个整数,则跳过foreach循环。 这是我的代码。
string strValue = "42 " if (int.TryParse(trim(strValue) , intVal)) == false { break; }
intVal是int?(可空INT)的variables。 我怎样才能使用Tryparse与可空int?
不幸的是,如果不使用其他variables,则不能这样做 – 因为out
参数的types必须完全匹配参数。
像丹尼尔的代码一样,但用第二个参数修正,修剪,避免与布尔常量进行比较:
int tmp; if (!int.TryParse(strValue.Trim(), out tmp)) { break; } intVal = tmp;
这里有一个TryParse的可为空的选项
public int? TryParseNullable(string val) { int outValue; return int.TryParse(val, out outValue) ? (int?)outValue : null; }
无法阻止自己生成通用版本。 下面的用法。
public class NullableHelper { public delegate bool TryDelegate<T>(string s, out T result); public static bool TryParseNullable<T>(string s, out T? result, TryDelegate<T> tryDelegate) where T : struct { if (s == null) { result = null; return true; } T temp; bool success = tryDelegate(s, out temp); result = temp; return success; } public static T? ParseNullable<T>(string s, TryDelegate<T> tryDelegate) where T : struct { if (s == null) { return null; } T temp; return tryDelegate(s, out temp) ? (T?)temp : null; } } bool? answer = NullableHelper.ParseNullable<bool>(answerAsString, Boolean.TryParse);
您可以创build一个帮助器方法来parsing一个可为空的值。
用法示例:
int? intVal; if( !NullableInt.TryParse( "42", out intVal ) ) { break; }
帮手方法:
public static class NullableInt { public static bool TryParse( string text, out int? outValue ) { int parsedValue; bool success = int.TryParse( text, out parsedValue ); outValue = success ? (int?)parsedValue : null; return success; } }
你也可以为此做一个扩展方法;
public static bool TryParse(this object value, out int? parsed) { parsed = null; try { if (value == null) return true; int parsedValue; parsed = int.TryParse(value.ToString(), out parsedValue) ? (int?)parsedValue : null; return true; } catch (Exception) { return false; } }
我已经在object
types上做了这个扩展,但它也可以在string
。 就我个人而言,我喜欢这些parsing器扩展在任何对象上都可用,因此在object
上的扩展而不是string
。
使用示例:
[TestCase("1", 1)] [TestCase("0", 0)] [TestCase("-1", -1)] [TestCase("2147483647", int.MaxValue)] [TestCase("2147483648", null)] [TestCase("-2147483648", int.MinValue)] [TestCase("-2147483649", null)] [TestCase("1.2", null)] [TestCase("1 1", null)] [TestCase("", null)] [TestCase(null, null)] [TestCase("not an int value", null)] public void Should_parse_input_as_nullable_int(object input, int? expectedResult) { int? parsedValue; bool parsingWasSuccessfull = input.TryParse(out parsedValue); Assert.That(parsingWasSuccessfull); Assert.That(parsedValue, Is.EqualTo(expectedResult)); }
不利的一面是,这会破坏分析值的框架语法;
int.TryParse(input, out output))
但我喜欢它的较短版本(不pipe它是否可读性更强,可能会被讨论);
input.TryParse(out output)