2012-05-19 308 views
1

在客戶端上,我有一個int數組,我稱其爲ToString方法;然後,我通過ajax將該字符串發送到服務器。將字符串轉換爲int64列表

在服務器上,我寫這篇文章:

var TestList = (from string s in TheString.Split(',') 
       select Convert.ToInt64(s)).ToList<long>(); 

這種的崩潰,如果輸入的字符串實際上包含意外的值?

謝謝。

+0

如果有一個不能成功解析的數字,你希望發生什麼? –

+0

我想知道它,並設置布爾值爲false;我正在清理來自客戶端的數據。 – frenchie

回答

2

如果字符串包含意外值,則可能會拋出FormatExceptionOverflowException,如Convert.ToInt64(string)的文檔中所述。

爲避免發生異常,您可以使用bool long.TryParse(string, out long)

List<long> testList = new List<long>(); 
foreach (string s in theString.Split(',')) 
{ 
    long number; 
    if (long.TryParse(s, out number)) 
    { 
     testList.Add(number); 
    } 
    else 
    { 
     // Do something? 
    } 
} 
+0

好的,謝謝你的建議。無論如何,使它適合作爲linq語法的單線程? – frenchie

+0

我只是認爲它讀得更好,但結果當然更重要。 – frenchie

+0

@frenchie你總是可以刪除所有的linebreaks。 –

2

你可以做一個單一的語句,但你需要一個輔助方法的幫助...

var TestList = 
    (from string s in TheString.Split(',') 
    let value = TryParseLong(s) 
    where value != null 
    select value.Value).ToList(); 

... 

static long? TryParseLong(string s) 
{ 
    long result; 
    if (long.TryParse(s, out result)) 
     return result; 
    return null; 
} 

注:實際上,你可以做沒有輔助方法:

long value; 
var TestList = 
    (from string s in TheString.Split(',') 
    where long.TryParse(s, out value) 
    select value).ToList(); 

但它不是一個好主意,因爲查詢產生的副作用,這可能會導致意外的行爲,如果查詢變得更加複雜。

+0

+1我喜歡這種方法,但它不會完全解決OP的問題(如果您看到有關將布爾值設置爲false的意見) –

+0

@ReedCopsey:是的,我是單線簡單解決方案的忠實粉絲,但是我只是意識到,對於這個,foreach更好。 – frenchie

+0

@Thomas:upvoted是因爲我愛的linq語法! – frenchie