2

我有一个来自 json 反序列化器的 ArrayList。这个数组应该只包含数字,但与往常一样,可能会发生坏事,我希望避免处理异常。这就是我所拥有的:

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

只要 TheArrayList 只包含数字,它就可以正常工作。如何将Convert.ToInt64语句更改为 a TryParse

谢谢。

4

4 回答 4

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);
}
于 2013-02-06T13:28:35.883 回答
0

你可以

      Int64 value;
      var TheListOfLongs = TheArrayList.
                          Where(entry => Int64.TryParse(entry, out value)).
                          Select(entry=> Convert.ToInt64(entry)).ToList<long>()
于 2013-02-06T13:29:25.780 回答
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
于 2013-02-06T13:32:20.283 回答
0

您可以利用 LINQ to Objects 的延迟特性:

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

这可行,但在其他方面存在问题:

  1. 如果您想将该代码转换为 PLINQ,它将中断。
  2. TheArrayList如果实际上是一些 IQueryable 进入数据库,它将中断。
  3. 它看起来像它的越野车
于 2013-02-06T13:34:09.857 回答