我正在重构一些代码,让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()
之间有什么区别?一个比另一个更有效吗?更加万无一失?
答案 0 :(得分:2)
records
以IEnumerable<dynamic>
开头。这意味着它实际上可以是任何实现IEnumerable<dynamic>
的东西,包括数组。它可能是List<dynamic>
或其他十几种集合类型中的一种。
它想要创建dynamic[]
。如果records
已经恰好是dynamic[]
类型的,则records as dynamic[]
会投出并返回它。如果没有,那个特定的表达式将返回null
,而空的合并运算符(??
)将返回右侧。
这个右侧运行LINQ方法.ToArray()
,无论类型records
恰好是什么类型,它会将其转换为dynamic[]
,并且可能涉及比简单转换更多的工作
根据此处的实际情况,您可能会自行更改一些内容 - 例如,如果您知道...;
部分从不返回dynamic[]
,你可能只有records.ToArray()
没有演员表。