2

json デシリアライザーからの ArrayList があります。この配列には数値のみを含める必要がありますが、いつものように、悪いことが起こる可能性があるため、例外を処理する必要がないようにしています。これは私が持っているものです:

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

TheArrayList に数値のみが含まれている限り、これは正常に機能します。Convert.ToInt64ステートメントをに変更するにはどうすればよい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 に答える