C#中创建无限序列(延迟加载)

简介:

无限序列意味着一个序列有无限多的元素。这似乎可以肯定,一般程序中内存是有限的,不可能生成一个无限的序列。其实,这里的无限序列指的是可以取任意多个元素。常规方法去初始化一个序列是无法实现。因此只要通过其他方式才能曲线实现。

使用IEnumerable接口,可以实现无限序列。因为IEnumerable接口继承于IEnumerator,因此实现了一个迭代器,也就是说,对于IEnumerable的实例(接口不能实例化,这里的意思指的是实现IEnumerable的类的实例)来说,可以使用迭代的方法依次遍历它的元素。而且,IEnumerable的实例中的元素,并不是在定义的时候才有,而是在真正使用它的时候才会计算。因此我们可以在定义的时候定义一个无限的序列,而真正使用的时候,肯定只是取这个无限序列中的某几个元素,这样就只需迭代这几个元素就行了。这就是延迟加载的好处。

具体实例如下,此处定义了一个无限的斐波纳契序列。

1
2
3
4
5
6
7
8
9
10
11
12
static  IEnumerable< int > fib()
        {
            int  pre = 0;
            int  next = 1;
            while  ( true )
            {
                var  val = pre + next;
                yield  return  val;
                pre = next;
                next = val;
            }
        }

乍一看,看到while (true),就觉得这是一个死循环,其实不然,里面有一个yield,每次迭代都会抛出值。while (true)里面的是迭代需要的循环,因为是死循环,也就是说可以迭代无数次。当然,如果你换成for循环,并且循环次数设成10次,那么只能迭代10次,这是就只是一个普通的有限序列了。

在使用这个序列的时候,可以如下:

1
var  f = fib(); //此时并未真正开始计算里面的元素。

如果要取10个元素,可以通过linq的扩展方法Take(10)取元素,但是要知道,Take(10)这个函数也并未正真的去取10个数,只有在真正用到的时候,才回去计算这些元素。

1
var  list=f.Take(10);

下面的代码要遍历这个序列,此时才会正真去计算里面的元素值。

1
2
3
4
foreach  ( var  in   list )
{
        Console.WriteLine(i);
  }

或者在Take(10)之后直接调用ToList,也能使得序列马上计算其中的元素。














本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1229663 ,如需转载请自行联系原作者




相关文章
|
2月前
|
存储 数据采集 数据处理
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C#)
73 0
|
3天前
|
并行计算 算法 数据挖掘
基于公共子序列的轨迹聚类(c#)
基于公共子序列的轨迹聚类(c#)
|
11月前
|
存储 安全 算法
Baumer工业相机堡盟工业相机如何通过BGAPISDK复制内存空间存储图像数据序列(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK复制内存空间存储图像数据序列(C#)
58 0
|
XML JSON IDE
C#复杂XML反序列化为实体对象两种方式 (上)
C#复杂XML反序列化为实体对象两种方式
193 0
C#复杂XML反序列化为实体对象两种方式 (上)
|
C#
一起谈.NET技术,C# 中奇妙的函数--联接序列的五种简单方法
  今天我们来看看5种使用Linq函数联接序列的方法,这5种方法可以归入下列两类:   同类的联接   Concat()   Union()   不同类的联接   Zip()   Join()   GroupJoin()   Concat() – 串联序列   最简单的序列合并,concat仅仅是将第二个序列接在第一个序列后面, 注意:返回的序列并没有改变原来元素的顺序: 1.
1026 0
|
C#
C# 中奇妙的函数--联接序列的五种简单方法
  今天我们来看看5种使用Linq函数联接序列的方法,这5种方法可以归入下列两类:   同类的联接   Concat()   Union()   不同类的联接   Zip()   Join()   GroupJoin()   Concat() – 串联序列   最简单的序列合并,concat仅仅是将第二个序列接在第一个序列后面, 注意:返回的序列并没有改变原来元素的顺序: 1.
952 0
|
C#
C#“.NET技术” 中奇妙的函数--联接序列的五种简单方法
  今天我们来看看5种使用Linq函数联接序列的方法,这5种方法可以归入下列两类:   同类的联接   Concat()   Union()   不同类的联接   Zip()   Join()   GroupJoin()   Concat() – 串联序列   最简单的序列合并,concat仅仅是将第二个序列接在第一个序列后面, 注意:返回的序列并没有改变原来元素的顺序: 1.
909 0
|
C#
C# 中奇妙的函数--联接序列的五种“.NET研究”简单方法
  今天我们来看看5种使用Linq函数联接序列的方法,这5种方法可以归入下列两类:   同类的联接   Concat()   Union()   不同类的联接   Zip()   Join()   GroupJoin()   Concat() – 串联序列   最简单的序列合并,concat仅仅是将第二个序列接在第一个序列后面, 注意:返回的序列并没有改变原来元素的顺序: 1.
975 0
|
Web App开发 算法 .NET
ASP.NET (Web) + C#算法 | 生成随机数字序列(随机数字+每个数字取随机不重复的位置和颜色)
关于今天的一个关于ASP的课后作业,是要求在ASP上实现随机生成数字序列: 具体要求: 随机位置:每个数字的位置相对随机; 随机颜色:每个数字的颜色随机且不重复; 随机数字:从0到9随机取出四个数; 正文 首先放上核心算法,这里我觉得在common.
1129 0