91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中創建無限序列(延遲加載)

發布時間:2020-08-05 10:04:22 來源:網絡 閱讀:926 作者:cnn237111 欄目:編程語言

無限序列意味著一個序列有無限多的元素。這似乎可以肯定,一般程序中內存是有限的,不可能生成一個無限的序列。其實,這里的無限序列指的是可以取任意多個元素。常規方法去初始化一個序列是無法實現。因此只要通過其他方式才能曲線實現。

使用IEnumerable接口,可以實現無限序列。因為IEnumerable接口繼承于IEnumerator,因此實現了一個迭代器,也就是說,對于IEnumerable的實例(接口不能實例化,這里的意思指的是實現IEnumerable的類的實例)來說,可以使用迭代的方法依次遍歷它的元素。而且,IEnumerable的實例中的元素,并不是在定義的時候才有,而是在真正使用它的時候才會計算。因此我們可以在定義的時候定義一個無限的序列,而真正使用的時候,肯定只是取這個無限序列中的某幾個元素,這樣就只需迭代這幾個元素就行了。這就是延遲加載的好處。

具體實例如下,此處定義了一個無限的斐波納契序列。

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次,這是就只是一個普通的有限序列了。

在使用這個序列的時候,可以如下:

var f = fib();//此時并未真正開始計算里面的元素。

如果要取10個元素,可以通過linq的擴展方法Take(10)取元素,但是要知道,Take(10)這個函數也并未正真的去取10個數,只有在真正用到的時候,才回去計算這些元素。

var list=f.Take(10);

下面的代碼要遍歷這個序列,此時才會正真去計算里面的元素值。

foreach (var i in  list )
{
       Console.WriteLine(i);
 }

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣汉县| 纳雍县| 华坪县| 曲沃县| 镇安县| 高邑县| 沧源| 大化| 嘉义县| 六枝特区| 澄迈县| 汽车| 八宿县| 陵川县| 理塘县| 微博| 汪清县| 石嘴山市| 金寨县| 耒阳市| 平泉县| 松原市| 抚顺县| 平湖市| 突泉县| 大庆市| 朝阳区| 富民县| 开封市| 新巴尔虎左旗| 嘉兴市| 元氏县| 拜城县| 韶山市| 泰兴市| 湘西| 九龙县| 南昌县| 黔西| 怀远县| 荣昌县|