1

こんにちは私は以下のようなlinqクエリを持っています

var perChange = (from data in globalDS.Tables[0].AsEnumerable().AsParallel()
              select data.Field<double>("PercentChange")).ToList();

これで、データセットglobalDSには、nullとvarcharの値が含まれます。したがって、生成される明らかな型キャストエラーがあります。試す方法はありますか。「変化率」列の値を解析し、有効なフィールドのみを選択してください。

4

3 に答える 3

4

DataRow.Fieldnull許容型をサポート:

List<double> result = globalDS.Tables[0].AsEnumerable().AsParallel()
             .Where(r  => r.Field<double?>("PercentChange").HasValue)
             .Select(r => r.Field<double?>("PercentChange").Value)
             .ToList();

編集:フィールドにdoubleではなく文字列が含まれていると述べたので:

List<double> result = globalDS.Tables[0].AsEnumerable().AsParallel()
             .Select(r => r.Field<string>("PercentChange").TryGetDouble())
             .Where(nullDouble => nullDouble.HasValue)
             .Select(nullDouble => nullDouble.Value)
             .ToList();

私はこの拡張機能を使用double?して、ローカル変数に「オンザフライ」で解析するよりも安全な文字列を、特にAsParallel次のように解析しようとしました。

public static Double? TryGetDouble(this string item, IFormatProvider formatProvider = null)
{
    if (formatProvider == null) formatProvider = NumberFormatInfo.CurrentInfo;
    Double d = 0d;
    bool success = Double.TryParse(item, NumberStyles.Any, formatProvider, out d);
    if (success)
        return d;
    else
        return null;
}
于 2012-11-09T14:35:57.807 に答える
2

これはどう:

double temp;

var perChange = (
     from data in globalDS.Tables[0].AsEnumerable().AsParallel()
     where !data.IsNull("PercentChange")
         && double.TryParse(data.Field<string>("PercentChange"), out temp)
     select double.Parse(data.Field<string>("PercentChange"))
    ).ToList();
于 2012-11-09T14:36:42.217 に答える
0

タイプをチェックするwhere句を使用してselectを試してください。これは次のようになります。where x != null && TypeOf(x) == double

于 2012-11-09T14:42:20.780 に答える