C# List.Max()函数在.NET内部是如何工作的?

C# List.Max()函数在.NET内部是如何工作的?,c#,.net,list,max,C#,.net,List,Max,我们可以在列表中使用Max方法来查找列表中的最大值。但它是如何在内部实现的?有没有办法了解它是如何在C中内部实现的?有一个参考源站点: 样本之一: public static int Max(this IEnumerable<int> source) { if (source == null) throw Error.ArgumentNull("source"); int value = 0; bool hasValue = false; foreac

我们可以在列表中使用Max方法来查找列表中的最大值。但它是如何在内部实现的?有没有办法了解它是如何在C中内部实现的?

有一个参考源站点:

样本之一:

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补充一下答案——他是Comment中的第一个:

首先,事实上,Max函数并没有在List类中实现。它是一个扩展方法,是LINQ命名空间的一部分,适用于列表实现的任何IEnumerable

现在,有几个Max的实现

第一个是微软发布的参考实现,正如评论中提到的,它展示了一个相对简单的实现,使用foreach循环遍历所有元素,检查它们是否高于上一个Max,并将其保留到下一个迭代中

可以在GitHub上找到另一种实现,Microsoft在GitHub中存储.NET核心框架较新版本的。这不是一个参考实现,而是进入CoreFX和框架最新版本的实际代码。它也相对简单,但不是使用foreach循环,而是使用source.GetEnumerator枚举值


我认为github托管的corefx项目是了解.NET framework类实现的最佳场所,因为它们是真实的生产代码,而不是潜在的未优化、简化或过时的参考实现。对于特定类型int、float、Nullable和其他允许小优化的常见类型,您可以看到许多类型特定的重载,比如不必将临时变量作为对象装箱,这对于数百万项目使用的核心框架方法是有意义的。这是一个值得探索的地方,可以看到内部工作是如何完成的。

是的,是的。我已经链接到第一个重载,如果你向下滚动,你可以看到有很多。你有什么理由需要查看源代码吗?MSDN解释了它需要做什么,如果没有,那就是一个bug?来自meThis的无向下投票不能是连续向下投票,因为用户只能在帖子上投票一次。@Caramiriel MSDN文档可能不清楚,有时甚至错误。源代码总是正确的。@Caramiriel只是想知道它是如何实现的。我不想回答,因此发表了评论。实际上,我已经投票决定以offtopic关闭—寻找一个非现场资源。字符串是引擎盖下的字符数组,因此最大字符由max返回。请注意,参考源代码也与实际代码保持最新—页面顶部当前声明其版本为4.6.1。我个人发现,使用它的索引功能快速导航到我想要查找的内容要容易得多。@JamesThorpe True,目前为止。但将来它可能会落后,而github代码根据定义是最新的代码。更新参考站点需要主动操作。