博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中创建无限序列(延迟加载)
阅读量:6894 次
发布时间:2019-06-27

本文共 1107 字,大约阅读时间需要 3 分钟。

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

使用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 ,如需转载请自行联系原作者

你可能感兴趣的文章
【设计模式】组合模式之神经网络应用
查看>>
Jenkins系统搭建及常见操作
查看>>
SQL Server 2012自动异地备份
查看>>
Ubuntu 下 SVN 多版本库的搭建
查看>>
CSS选择器
查看>>
PHP遍历接口Iterator详解
查看>>
一款简单到极致的 React 数据流框架——Refast
查看>>
ribbon的ServerListRefreshInterval
查看>>
Android我还可以相信你多少系列文章二之音视频播放
查看>>
使用Brotli提高网站访问速度
查看>>
Python3安装Pymongo
查看>>
OS层面删除数据文件后的恢复方式(LINUX):
查看>>
用FileZilla搭建FTP服务器及相关问题
查看>>
http状态吗307,303,302的区别
查看>>
(译)Scrum和XP的不同
查看>>
Vue 2 | Part 5 列表渲染和事件监听
查看>>
Redux概念之四: reducer(归纳函数)与纯函数
查看>>
页面加载事件--DOMContentLoaded
查看>>
Vue2 + Nodejs + WebSocket 完成你画我猜多人在线游戏
查看>>
es6快速入门
查看>>