我想使用TryParse來查找字符串值是否是整數。如果該值是一個整數,則跳過foreach循環。這是我的代碼。如何使用int.TryParse與可爲空的int?
string strValue = "42 "
if (int.TryParse(trim(strValue) , intVal)) == false
{
break;
}
intVal是int?(可空INT)類型的變量。我怎樣才能使用Tryparse與可空int?
我想使用TryParse來查找字符串值是否是整數。如果該值是一個整數,則跳過foreach循環。這是我的代碼。如何使用int.TryParse與可爲空的int?
string strValue = "42 "
if (int.TryParse(trim(strValue) , intVal)) == false
{
break;
}
intVal是int?(可空INT)類型的變量。我怎樣才能使用Tryparse與可空int?
不幸的是,如果不使用其他變量,則不能這樣做 - 因爲out
參數的類型必須完全匹配參數。
像丹尼爾的代碼,而是固定在第二個參數方面,修剪,並避免與布爾常量的比較:
int tmp;
if (!int.TryParse(strValue.Trim(), out tmp))
{
break;
}
intVal = tmp;
您可以創建一個輔助方法來解析一個空值。
實例應用:
int? intVal;
if(!NullableInt.TryParse("42", out intVal))
{
break;
}
helper方法:
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;
}
}
下面是可空INT選項與的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);
你也可以爲此做一個擴展方法;
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
類型的擴展名,但它也同樣可以在string
。我個人喜歡這些解析器擴展名可用於任何對象,因此在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))
但我喜歡它的較短版本(不管它是否更易讀或可能會被討論);
input.TryParse(out output)
@JonSkeet - strValue cna爲空,Trim()方法會導致異常。只是說。 :) – 2013-06-14 12:33:50
@ShaktiPrakashSingh:我們不知道'strValue'是否可以爲null。如果它來自文本框,它可能*不能*爲空。我的代碼並不試圖解決這個問題,但我們真的不知道它是否應該解決它。 – 2013-06-14 17:29:10
爲什麼不反轉'if'?例如:'if(int.TryParse(Request [「idParent」],out tmp))idParent = tmp;'(否則爲空) – Dementic 2014-01-09 10:01:34