我们可以使用List中的Max()方法来查找列表中的最大值。但它是如何在内部实施的?有没有办法看看它是如何在C#内部实现的?
答案 0 :(得分:3)
有一个参考源网站:link
示例(重载之一):
public static int Max(this IEnumerable<int> source) {
if (source == null) throw Error.ArgumentNull("source");
int value = 0;
bool hasValue = false;
foreach (int x in source) {
if (hasValue) {
if (x > value) value = x;
}
else {
value = x;
hasValue = true;
}
}
if (hasValue) return value;
throw Error.NoElements();
}
呃,让James Thorpe
加上答案 - 他是第一个(在传播中):)
答案 1 :(得分:0)
首先,Max()
函数实际上并不是在List<T>
类中实现的。它是一个扩展方法,是LINQ命名空间的一部分,适用于IEnumerable<T>
实现的任何List<T>
。
现在,Max()有几种实现方式。
第一个是Microsoft作为Reference Source site的一部分发布的参考实现,如评论中所述,它显示了一个使用foreach
循环覆盖所有元素的相对简单的实现,检查它们是否高于之前的Max,并保留下一次迭代。
可以在GitHub上找到替代实现,其中Microsoft存储actual code用于较新版本的.NET Core框架。这不是一个参考实现,而是进入CoreFX的实际代码和框架的最新版本。它也相对简单,但它不使用foreach循环,而是使用source.GetEnumerator()
来枚举值。
我认为github托管的corefx项目是今天学习.NET框架类实现的最佳位置,因为它们是真正的实时生产代码,而不是可能未被优化,简化或过时的参考实现。您可以看到许多特定类型(int,浮点数,Nullable和其他常见类型)的特定于类型的重载,它们允许进行微小的优化 - 例如不必将临时变量打包为object
,这对于数百万个项目使用的核心框架方法。这是一个迷人的地方,可以探索如何在内部完成任务。