您好我有一个linq查询,如下所示
var perChange = (from data in globalDS.Tables[0].AsEnumerable().AsParallel()
select data.Field<double>("PercentChange")).ToList();
现在,数据集globalDS包含null以及varchar值。因此,生成了明显的类型转换错误。有没有办法尝试。在“百分比变化”列中分析值,只选择有效字段。
答案 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