2013-02-06 24 views
2

我有一個來自json解串器的ArrayList。這個數組應該只包含數字,但一如既往,不好的事情可能發生,我正在尋找避免處理異常。這是我的:linq解析來自ArrayList的int

var TheListOfLongs = (from object s in TheArrayList 
         select Convert.ToInt64(s)).ToList<long>(); 

只要TheArrayList只包含數字,這工作正常。如何將Convert.ToInt64聲明更改爲TryParse

謝謝。

回答

2
long outValue; 
//will work, but double conversion 
var result = TheArrayList.Cast<object>() 
      .Where(m => Int64.TryParse(m.ToString(), out outValue)) 
      .Select(m => Convert.ToInt64(m)).ToList(); 

//should avoid double Parse, but untested, see Daniel Hilgarth's answer and warnings. 
var result = TheArrayList.Cast<object>() 
      .Where(m => Int64.TryParse(m.ToString(), out outValue)) 
      .Select(m => outValue).ToList(); 

或舊的foreach,這可能是最好的選擇。

var list = new List<long>(); 
long outValue; 
foreach (object value in the ArayList) { 
    if (Int64.TryParse(value.ToString(), out outValue)) 
     list.Add(outValue); 
} 
+3

特別是因爲這將雙重轉換,不是嗎? –

+0

@ChrisSinclair是的。 –

+0

您可以通過'選擇'm => outValue'來避免雙重轉換,但是這會引發一些WTF。 – Rawling

0

你可以

 Int64 value; 
     var TheListOfLongs = TheArrayList. 
          Where(entry => Int64.TryParse(entry, out value)). 
          Select(entry=> Convert.ToInt64(entry)).ToList<long>() 
0

,我正環通,沒有必要對LINQ

bool allParsed = true; 
List<long> longList = new List<long>(); 
foreach(object s in TheArrayList) 
{ 
    long val; 
    if(Int64.TryParse(s, out val)) 
     longList.Add(val); 
    else 
    { 
     allParsed = false; 
     break; 
    } 
} 

if(!allParsed) 
    // handle the error 
0

您可以使用LINQ的遞延性質的對象:

long value = 0; 
var result = TheArrayList.Where(m => long.TryParse(m, out value)) 
         .Select(x => value); 

這個工作,但它是問題atic以其他方式:

  1. 如果您想將該代碼轉換爲PLINQ,它會中斷。
  2. 如果TheArrayList實際上是一些IQueryable進入數據庫,它會中斷。
  3. 它看起來像是越野車
+0

它實際上說ArrayList不包含Where的定義 – frenchie

+0

@frenchie:如果'TheArrayList'是一個非泛型列表,只需在'Where'前面放置'Cast ()'。 –