我有两个对象声明为IEnumerable<DateTime>
xVal和IEnumerable<double>
yVal。
然后我的程序在哪里:
var xVals = from p in result where p.chemical == "Benzene" select p.SampDate_Name;
var yVals = from p in result where p.chemical == "Benzene" select p.PCL;
然后我尝试以下任务:
xVal = xVals as IEnumerable<DateTime>;
yVal = yVals as IEnumerable<double>;
以上代码将xVal
和yVal
设为null 。
有人可以解释这里有什么问题吗?我非常感谢你的帮助。
感谢。
有一点是肯定的:输入不为空。所以xVals和yVals是非空的,由我调试。我也可以遍历它们以获取每个内容。 当我回来并发布我的发现时,我会尝试其他建议。非常感谢你的回复。
这里的问题是LINQ执行是懒惰的,它将在你执行foreach或ToList / ToArray / ToDictionary时执行。我的代码中的两个linq查询在分配完成之前未执行。因此, xVal 和 yVal 设置为null。 感谢您的帮助。
答案 0 :(得分:3)
如果输入为null或无法执行强制转换,则as关键字将输出设置为null。
如果你使用xVal = (IEnumerable<DateTime>)xVals
,你可能会得到一个例外,说它无法投射。
答案 1 :(得分:1)
如果你有一个泛型集合,要把它带到IEnumerable,试试.AsEnumerable()。所以你的新代码......
xVal = xVals.AsEnumerable();
yVal = yVals.AsEnumerable();
答案 2 :(得分:0)
as
关键字实际上并不进行转换,而是在相关引用类型之间进行转换。因此,如果您具有具体类型,则可以使用as
将其分配给具有基类类型的新变量。如果类型不兼容,那么将返回null。这是进行类型检查的好方法,无需担心异常。相反,您可以对转换结果执行空检查。
很难说出什么类型的p.SampDate_Name和p.PCL,但我猜猜字符串?如果是这样,您可以将强制转换添加到select语句。
var xVals = from p in result where p.chemical == "Benzene" select DateTime.Parse(p.SampDate_Name);
var yVals = from p in result where p.chemical == "Benzene" select Double.Parse(p.PCL);