C# IEnumerable<;T>;分配

C# IEnumerable<;T>;分配,c#,.net,ienumerable,variable-assignment,C#,.net,Ienumerable,Variable Assignment,我有两个对象声明为IEnumerablexVal和IEnumerableyVal。 那么我的程序在哪里呢 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 IEnumerab

我有两个对象声明为
IEnumerable
xVal和
IEnumerable
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=xVals作为IEnumerable;
yVal=yVals作为IEnumerable;
上述代码
xVal
yVal
设置为null

有人能解释一下这里出了什么问题吗?我将非常感谢你的帮助

谢谢


有一点是肯定的:输入不是空的。因此,我调试的XVAL和YVAL都是非空的。我还能够循环通过它们来获取每个文件的内容。 当我回来后,我会尝试其他的建议并发布我的发现。谢谢大家的回复

这里的问题是LINQ是惰性执行的,它将在您执行foreach或ToList/ToArray/ToDictionary时执行。在分配完成之前,代码中的两个linq查询没有执行。因此,xValyVal被设置为空。
感谢所有帮助。

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

如果使用
xVal=(IEnumerable)xVals
,您可能会得到一个异常,说明无法强制转换它


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

如果使用
xVal=(IEnumerable)xVals
,您可能会得到一个异常,说明无法强制转换它


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

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

如果您有一个泛型集合,要将其转换为IEnumerable,请尝试.AsEnumerable()。所以你的新代码

xVal = xVals.AsEnumerable();
yVal = yVals.AsEnumerable();

如果您有一个泛型集合,要将其转换为IEnumerable,请尝试.AsEnumerable()。所以你的新代码

xVal = xVals.AsEnumerable();
yVal = yVals.AsEnumerable();

调试器告诉您(xVals作为IEnumerable.ToString();)的什么?当您将鼠标悬停在
var
关键字上时,会显示什么?将鼠标悬停在var关键字上会显示:IEnumerable和IEnumerable。因此,调试器在执行Linq时将强制转换为正确的类型。所以我的问题是IEnumerable是什么意思。。。这似乎就是问题所在。(xVals作为IEnumerable)。ToString()抛出一个运行时错误,表示“对象引用未设置为对象的实例”。我不知道为什么将XVAL设置为Linq查询的结果时会出现这种情况。调试器告诉您(XVAL作为IEnumerable.ToString();)的原因是什么?当您将鼠标悬停在
var
关键字上时,会显示什么?将鼠标悬停在var关键字上会显示:IEnumerable和IEnumerable。因此,调试器在执行Linq时将强制转换为正确的类型。所以我的问题是IEnumerable是什么意思。。。这似乎就是问题所在。(xVals作为IEnumerable)。ToString()抛出一个运行时错误,表示“对象引用未设置为对象的实例”。当xVAL被设置为Linq查询的结果时,我不知道为什么会这样。它的优点不是在不引发异常的情况下进行类型检查(毕竟,
操作符的作用),而是可以在一个操作中执行强制转换和类型检查,这更有效。此外,在将变量从具体类型分配到基类型时,甚至不需要使用
as
运算符。如果可能,
as
运算符会执行强制转换。它的优点不是在不引发异常的情况下进行类型检查(毕竟,
操作符的作用),而是可以在一个操作中执行强制转换和类型检查,这更有效。此外,当从具体类型向基类型分配变量时,甚至不需要使用
as
运算符。。。但编译器抛出一个错误,说明:无法将类型…IEnumerable隐式转换为…IEnumerable。存在显式转换。日期时间?与DateTime不同,这可能是其他强制转换尝试返回null的原因,因为它们的类型不同。您可以尝试使用xVal=xVals作为IEnumerable;看看你能不能得到更好的结果我试着这么做。。。但编译器抛出一个错误,说明:无法将类型…IEnumerable隐式转换为…IEnumerable。存在显式转换。日期时间?与DateTime不同,这可能是其他强制转换尝试返回null的原因,因为它们的类型不同。您可以尝试使用xVal=xVals作为IEnumerable;看看你能不能得到更好的结果。