考虑以下代码:了解扩展的ElementAt(指数)
int size = 100 * 1000 * 1000;
var emu = Enumerable.Range(0, size);
var arr = Enumerable.Range(0, size).ToArray();
当我打电话emu.ElementAt(大小-10)和arr.ElementAt(大小-10)和测量时间的ARR更快(数组为0.0002s,而IEnumerable为0.59s)。
据我所知,进一步扩展方法ElementAt()具有签名
public static TSource ElementAt<TSource>(this IEnumerable<TSource> source, int index)
并且由于“源”是一个IEnumerable的执行是相似的逻辑 - 反对我所看到的,其中阵列直接访问。
可能有人请解释这:)
你可以通过让自定义集合类型实现IList来间接地选择优化,但是明确地实现它和/或只将它公开为'IEnumerable '。这并不理想,但基本上这些都是优化的'钩子',如果你愿意,你可以为每个自定义扩展方法提供一个自定义的接口,允许类编写器重写扩展方法的行为,尽管这可能会有点混乱,像'WidgetExtensions.ToggleWidget (这个Widget小部件)'和'WidgetExtensions.IToggleWidget '。 –
2010-07-05 17:12:39