IEnumerable <t>赋值</t>

时间:2011-09-02 21:25:37

标签: c# .net ienumerable variable-assignment

我有两个对象声明为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>;

以上代码xValyVal设为null

有人可以解释这里有什么问题吗?我非常感谢你的帮助。

感谢。


有一点是肯定的:输入不为空。所以xVals和yVals是非空的,由我调试。我也可以遍历它们以获取每个内容。 当我回来并发布我的发现时,我会尝试其他建议。非常感谢你的回复。

这里的问题是LINQ执行是懒惰的,它将在你执行foreach或ToList / ToArray / ToDictionary时执行。我的代码中的两个linq查询在分配完成之前未执行。因此, xVal yVal 设置为null。 感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

如果输入为null或无法执行强制转换,则as关键字将输出设置为null。

如果你使用xVal = (IEnumerable<DateTime>)xVals,你可能会得到一个例外,说它无法投射。

MSDN description for as keyword

答案 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);