Enumerable.Last ()和C#数组
说我有一个简单的数组:
double[] myDoubleArray = new double[] { 0, 1, 2, 3, 4, 5 };
这是性能如何:
double last = myDoubleArray.Last();
这个?
double last = myDoubleArray[myDoubleArray.Length - 1];
即使可以进行上述优化,Last Last()还会枚举整个数组吗?
如果我传递了一些其他IEnumerable(比如一个已经产生的),Last() 必须枚举序列。 我更喜欢使用Last(),因为代码看起来更干净,但如果它枚举序列我就不会做出牺牲。
不,它不会迭代所有元素。 这是来自reflection器的Enumerable.Last()的代码。 如你所见,它进行了这样的优化
public static TSource Last(this IEnumerable source) { if (source == null) { throw Error.ArgumentNull("source"); } IList list = source as IList ; if (list != null) { int count = list.Count; if (count > 0) { return list[count - 1]; } } else { using (IEnumerator enumerator = source.GetEnumerator()) { if (enumerator.MoveNext()) { TSource current; do { current = enumerator.Current; } while (enumerator.MoveNext()); return current; } } } throw Error.NoElements(); }
不, 没有谓词的Last
一个优化IList
情况,包括一维数组。
使用谓词,它不执行优化。 特别是,它不会从最后向后工作(由于例外可能会改变结果)。
直接访问最后一个元素仍然会稍微快一些,但Last()
更具可读性并且只是“常量时间”不同 – 在这种情况下它不会将O(1)操作更改为O(N) 。
有关Last
更多信息,请参阅我的Edulinq博客文章 。
请注意,优化没有记录,所以可以说你不应该依赖它。 在实践中,我无法想象它会变成O(N):)
上述就是C#学习教程:Enumerable.Last ()和C#数组分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949848.html