IEnumerable 如何在后台工作

2024-04-15

我正在徘徊于更深入的功能IEnumerable<T>界面。

基本上,它充当执行的中间步骤。例如,如果你写:

IEnumerable<int> temp = new int[]{1,2,3}.Select(x => 2*x);

结果Select函数不会被计算(枚举),直到使用 temp 完成某些操作以允许它(例如List<int> list = temp.ToList()).

然而,令我困惑的是,因为IEnumerable<T>是一个接口,根据定义,它不能被实例化。那么,实际项目的集合是什么(在示例中2*x项)驻留在?

此外,如果我们要写IEnumerable<int> temp = Enumerable.Repeat(1, 10);,存储 1 的底层集合是什么(数组、列表、其他)?

我似乎无法找到关于此接口及其功能的实际实现的彻底(更深入)的解释(例如,如果有一个底层集合,那么它如何yield关键词工作)。

基本上,我要求的是对功能的更详细的解释IEnumerable<T>.


实施应该不重要。所有这些 (LINQ) 方法都会返回IEnumerable<T>,接口成员是您可以访问的唯一成员,这应该足以使用它们。

但是,如果您确实需要知道,您可以在以下位置找到实际的实现http://sourceof.net http://sourceof.net.

  • 可枚举.cs http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs

但是,对于某些方法,您将无法找到显式的类声明,因为其中一些方法使用yield return,这意味着编译器在编译期间生成正确的类(带有状态机)。例如Enumerable.Repeat是这样实现的:

public static IEnumerable<int> Range(int start, int count) {
    long max = ((long)start) + count - 1;
    if (count < 0 || max > Int32.MaxValue)
        throw Error.ArgumentOutOfRange("count");
    return RangeIterator(start, count); 
}

static IEnumerable<int> RangeIterator(int start, int count) {
    for (int i = 0; i < count; i++)
        yield return start + i;
}

您可以在 MSDN 上阅读更多相关内容:迭代器(C# 和 Visual Basic) http://msdn.microsoft.com/en-us/library/dscyy5s0.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IEnumerable 如何在后台工作 的相关文章

随机推荐