【发布时间】:2012-03-12 09:31:52
【问题描述】:
这是我的代码:
protected IEnumerable<Hotel> Hotels;
protected Hotel Hotel;
Hotels = from Hotel hotel in new Hotels()
select hotel;
Response.Write("RES " + Hotels.Count() + "<br />");
if (Hotels.Count() > 0)
{
Hotel = Hotels.First();
}
Response.Write("RES " + Hotels.Count() + "<br />");
Response.Write("RES " + Hotels.Count() + "<br />");
嗯,酒店有 1 项。但是结果呢:
RES 1
RES 0
RES 1
为什么?似乎.First() 与迭代器混淆了?如何使用 IEnumberable 修复它? (不使用其他类型的列表,我需要 IEnumerable)。
【问题讨论】:
-
Hotels 是如何填充的以及底层存储是什么,例如它实际上是在引用 List
吗? -
行为取决于酒店的具体情况。如果它包含对可以更改的数据源的某些引用/连接,那么显然该值可以在对 Count 的调用之间更改,或者如果它是通过 yield return 实现的,它可能会做任何事情。尝试在它上面调用 ToArray(),然后对 ToArray() 返回的值进行计数等,然后你就知道你有一个固定的集合快照。
-
Hotels 的实际实现可能有问题。例如,它适用于列表。
-
哪个类实现了 IEnumerable?你如何初始化
Hotels变量?它适用于列表数组等。顺便说一句,您可以使用FirstOrDefault()扩展方法而不是 if 构造。 -
刚刚在带有List的控制台应用程序中对其进行了测试,它按预期返回了1、1、1。
标签: c# .net list ienumerable