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.Field支持可为空的类型:

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

编辑:既然您提到该字段包含字符串而不是双精度数:

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 子句进行选择。这将是这样的:where x != null && TypeOf(x) == double

于 2012-11-09T14:42:20.780 回答