2010-08-02 23 views
74

我想使用TryParse來查找字符串值是否是整數。如果該值是一個整數,則跳過foreach循環。這是我的代碼。如何使用int.TryParse與可爲空的int?

string strValue = "42 " 

if (int.TryParse(trim(strValue) , intVal)) == false 
{ 
    break; 
} 

intVal是int?(可空INT)類型的變量。我怎樣才能使用Tryparse與可空int?

回答

69

不幸的是,如果不使用其他變量,則不能這樣做 - 因爲out參數的類型必須完全匹配參數。

像丹尼爾的代碼,而是固定在第二個參數方面,修剪,並避免與布爾常量的比較:

int tmp; 
if (!int.TryParse(strValue.Trim(), out tmp)) 
{ 
    break; 
} 
intVal = tmp; 
+0

@JonSkeet - strValue cna爲空,Trim()方法會導致異常。只是說。 :) – 2013-06-14 12:33:50

+3

@ShaktiPrakashSingh:我們不知道'strValue'是否可以爲null。如果它來自文本框,它可能*不能*爲空。我的代碼並不試圖解決這個問題,但我們真的不知道它是否應該解決它。 – 2013-06-14 17:29:10

+0

爲什麼不反轉'if'?例如:'if(int.TryParse(Request [「idParent」],out tmp))idParent = tmp;'(否則爲空) – Dementic 2014-01-09 10:01:34

5

您可以創建一個輔助方法來解析一個空值。

實例應用:

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; 
    } 
} 
101

下面是可空INT選項與的TryParse

public int? TryParseNullable(string val) 
{ 
    int outValue; 
    return int.TryParse(val, out outValue) ? (int?)outValue : null; 
} 
+3

我喜歡這個版本,因爲「0」返回0,「hello」返回null。在接受的答案中,這種區別就失去了。 – 2010-08-02 19:47:08

+8

我不喜歡他的回答,因爲它失去了表示解析成功/失敗的返回值。這是Try *方法的一個重要特性。 – frattaro 2015-07-23 12:59:08

+1

@frattaro我真的不明白爲什麼這個答案可能是壞的。嘗試解析返回0默認情況下失敗,在此示例中它只是返回null。 – Edgar 2017-06-01 15:30:15

20

無法阻止自己製作一個通用版本。下面的用法。

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); 
3

你也可以爲此做一個擴展方法;

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) 
+0

如果你這樣做,你只能鎖定到'TryParse'中。 「雙」呢?或者'bool'? – FMM 2014-08-26 18:17:27

+0

@FMM有點晚了,但是,如果你想要的話,爲這些人編寫一個單獨的擴展方法。不確定你的意思是「鎖定」其他擴展方法將具有不同的簽名 – 2015-10-28 15:16:12

+0

對於結構,「T」可以隱式轉換爲「T」。這是矯枉過正。 – FMM 2015-10-28 16:11:43