2013-02-22 40 views
2

我有以下兩種方法將int轉換爲short?將int轉換爲short的更好方法? (NULL,如果不可能)

  1. 如果該值不在短程範圍內,則第一個失敗。
  2. 第二種方法可行,但它有一個不必要的conversion to string

有沒有更好的方法?

編輯

從下面的答案:

的Int16只是爲Int32一個子集,所以你不需要任何轉換爲​​ 「中間」 類型。

CODE

//Approach 1 
int vIn = 123456789; 
short? vOut = Convert.ToInt16(vIn); 
//Value was either too large or too small for an Int16. 

//Approach 2 
short? vOut2 = null; 
int vIn2 = 123456789; 
short number; 
string characterRepresentationOfInt = vIn2.ToString(); 
bool result = Int16.TryParse(characterRepresentationOfInt, out number); 
if (result) 
{ 
    vOut2 = number; 
} 

參考:

  1. Java: Conversion from int to short

回答

7

爲什麼你不能簡單地使用內置在劇組的轉換?只需添加一張支票以確保它不超出範圍(如果您想要null值而不是例外)。

short? ConvertToShort(int value) 
{ 
    if (value < Int16.MinValue || value > Int16.MaxValue) 
     return null; 

    return (short)value; 
} 

關於你的方法:

  1. 它的工作原理(當然),但你永遠不會得到null值,如果value是外面的Int16有效範圍轉換可能會失敗。

  2. 這是非常緩慢。不要忘記Int16只是Int32的子集,因此您不需要任何轉換爲​​「中間」類型。

+0

是的......「Int16只是Int32的一個子集,所以你不需要任何轉換到」中間「類型。」這是我錯過的關鍵點......非常感謝。 – Lijo 2013-02-22 13:37:16

+0

@AdrianoRepetti對不起,我發表評論到錯誤的答案。沒關係。 – ViRuSTriNiTy 2018-02-15 06:27:39

1

這裏有幾個可能的解決方案。

靜態輔助方法:

public static class Number 
{ 
    public static bool TryConvertToShort(int value, out short result) 
    { 
     bool retval = false; 
     result = 0; 
     if (value > Int16.MinValue && value < Int16.MaxValue) 
     { 
      result = Convert.ToInt16(value); 
      retval = true; 
     } 

     return retval; 
    } 
} 

用法:

int a = 1234; 
short b; 
bool success = Number.TryConvertToShort(a, out b); 

擴展方法:

public static class ExtendInt32 
{ 
    public static bool TryConvertToShort(this int value, out short result) 
    { 
     bool retval = false; 
     result = 0; 
     if (value > Int16.MinValue && value < Int16.MaxValue) 
     { 
      result = Convert.ToInt16(value); 
      retval = true; 
     } 

     return retval; 
    } 
} 

用法:

int a = 1234; 
short b; 
bool success = a.TryConvertToShort(out b); 

您也可以創建一個不會失敗的幫助程序/擴展方法,而是返回一個默認值(0)或引發異常。

public static short ConvertToShort(int value) 
{ 
    short result; 
    if (value > Int16.MinValue && value < Int16.MaxValue) 
    { 
     result = Convert.ToInt16(value); 
    } 
    else 
    { 
     throw new OverflowException(); 
    } 

    return result; 
} 
+0

爲什麼downvote? – 2013-02-22 13:38:17

+0

我沒有downvote ...我沒有看到任何downvote的原因以及... [我實際上upvoted] – Lijo 2013-02-22 13:46:44

+1

讓我猜測:他要求一個空值,如果超出範圍和Convert.ToInt16()拋出OverflowException本身。這就是說,如果適用,我更喜歡TryConvert方法來返回空值。 – 2013-02-22 13:46:50