'as dynamic []'和ToArray()

时间:2017-02-23 09:14:30

标签: c# performance dynamic ienumerable

我正在重构一些代码,让ReSharper帮我解决一下。我收到了这段代码:

IEnumerable<dynamic> records = ...;
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[records.Count()];

他告诉我,可能会有Possible multiple enumeration of IEnumerable。所以我让ReSharper重构,他给了我这个:

IEnumerable<dynamic> records = ...;
dynamic[] recordsAsArray = records as dynamic[] ?? records.ToArray();
ScheduleTemplateInfo[] resultTemplateInfos = new ScheduleTemplateInfo[recordsAsArray.Length];

现在,我认为乍一看确实看起来效率更高。但是,我很好奇插入的第二行。

投放记录as dynamic[]和制作记录.ToArray()之间有什么区别?一个比另一个更有效吗?更加万无一失?

1 个答案:

答案 0 :(得分:2)

recordsIEnumerable<dynamic>开头。这意味着它实际上可以是任何实现IEnumerable<dynamic>的东西,包括数组。它可能是List<dynamic>或其他十几种集合类型中的一种。

它想要创建dynamic[]。如果records已经恰好是dynamic[]类型的,则records as dynamic[]会投出并返回它。如果没有,那个特定的表达式将返回null,而空的合并运算符(??)将返回右侧。

这个右侧运行LINQ方法.ToArray(),无论类型records恰好是什么类型,它会将其转换为dynamic[],并且可能涉及比简单转换更多的工作

根据此处的实际情况,您可能会自行更改一些内容 - 例如,如果您知道...;部分从不返回dynamic[] ,你可能只有records.ToArray()没有演员表。