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

时间:2015-12-23 10:50:44

标签: c# .net list max

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

2 个答案:

答案 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,这对于数百万个项目使用的核心框架方法。这是一个迷人的地方,可以探索如何在内部完成任务。