IEnumerable.Select()返回意外结果

时间:2017-10-06 10:54:19

标签: c# azure ienumerable

我使用C#查询Azure表存储,它返回一个IEnumerable。我正在使用.Select()从我的结果中获取两个不同的属性,但每个属性的计数都不正确。例如:

IEnumerable<SomeClass> results = table.ExecuteQuery(query);
IEnumerable<DateTime> dates = results.Select(x => x.Date);
IEnumerable<double> doubles = results.Select(x => x.Doubles);

每个结果都有一个日期和一个双倍值(我已经验证了这一点),因此每个结果的计数应该完全相同,结果却会以不同的方式返回。我可能有300k的结果,然后是299,997个日期和300,003个双打。

当我做类似的事情时:

results.ToList();

然后使用.Select()我得到了正确的结果。我试图避免首先将记录转换为列表,因为它需要太长时间。我也想避免使用for循环或foreach循环,因为它们也需要太长时间。

我的问题是:有没有办法在IEnumerable上使用.Select()并获得准确的结果?或者还有另一种方法可以做到这一点非常快吗?

注意:我正在xy图上绘制这些数据,对于大约300k记录,它需要大约1分30秒。大约90%的时间是由于我有一个foreach循环。如果我首先转换为列表,则处理时间会更长。在IEnumerable上使用.Select()非常快,但我需要可靠的结果,x值的数量必须与y值相同。

1 个答案:

答案 0 :(得分:0)

Azure表/ SDK使用延迟枚举。当您调用executequery但迭代返回的Ienumerable结果时,不会对表服务检索实体的实际http请求。这是为什么你看到差异结果的一种可能性,当你通过选择迭代枚举时,表格中的数据可能会发生变化?