尝试解析linq

时间:2012-11-09 14:31:25

标签: linq c#-4.0

您好我有一个linq查询,如下所示

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

现在,数据集globalDS包含null以及varchar值。因此,生成了明显的类型转换错误。有没有办法尝试。在“百分比变化”列中分析值,只选择有效字段。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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();

答案 2 :(得分:0)

使用where子句尝试选择,在子句中检查类型。这类似于:where x != null && TypeOf(x) == double