【问题标题】:IEnumerable<T> assignmentIEnumerable<T> 赋值
【发布时间】:2011-11-09 12:02:44
【问题描述】:

我有两个对象声明为IEnumerable&lt;DateTime&gt; xVal 和IEnumerable&lt;double&gt; 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 查询在分配完成之前没有执行。因此 xValyVal 被设置为空。 感谢大家的帮助。

【问题讨论】:

  • 调试器告诉你什么 (xVals as IEnumerable).ToString(); ?
  • 当您将鼠标悬停在var 关键字上时,它会说什么?
  • 将鼠标悬停在 var 关键字上会告诉我们: IEnumerable 和 IEnumerable 分别。因此,调试器在执行 Linq 时正在转换为正确的类型。所以我的问题是 IEnumerable 是什么意思...这似乎是问题所在。
  • (xVals as IEnumerable).ToString() 引发运行时错误,提示“对象引用未设置为对象的实例”。当 xVals 设置为 Linq 查询的结果时,我不知道为什么会这样。

标签: c# .net ienumerable variable-assignment


【解决方案1】:

如果您有一个通用集合,要将其提供给 IEnumerable,请尝试使用 .AsEnumerable()。所以你的新代码...

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

【讨论】:

  • 我试图这样做...但是编译器抛出一个错误说:不能隐式地将类型 ...IEnumerable 转换为 ...IEnumerable。存在显式转换。
  • 日期时间?与 DateTime 不同,这可能是您的其他演员尝试返回 null 的原因,因为它们不是同一类型。您可以尝试使用 xVal = xVals as IEnumerable;看看你是否能得到更好的结果。
【解决方案2】:

as 关键字实际上并不进行强制转换,而是在相关引用类型之间进行转换。因此,如果您有具体类型,则可以使用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 运算符确实 执行强制转换(如果可能)。并且优点不是类型检查而不抛出异常(毕竟,这就是 is 运算符的用途),而是您可以在一个操作中进行强制转换和类型检查,这样效率更高。此外,在将变量从具体类型分配给基类型时,您甚至不需要使用 as 运算符。
【解决方案3】:

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

如果你使用xVal = (IEnumerable&lt;DateTime&gt;)xVals,你可能会得到一个异常,说它不能被强制转换。

MSDN description for as keyword

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多