C#中的foreach和yield

来源:http://www.cnblogs.com/ldyblogs/archive/2017/09/28/foreach.html
-Advertisement-
Play Games

1. foreach C#編譯器會把foreach語句轉換為IEnumerable介面的方法和屬性。 foreach語句會解析為下麵的代碼段。 調用GetEnumerator()方法,獲得數組的一個枚舉 在while迴圈中,只要MoveNext()返回true,就一直迴圈下去 用Current屬性訪 ...


1. foreach

C#編譯器會把foreach語句轉換為IEnumerable介面的方法和屬性。

foreach (Person p in persons)
 {
     Console.WriteLine(p);
 }

foreach語句會解析為下麵的代碼段。

調用GetEnumerator()方法,獲得數組的一個枚舉

在while迴圈中,只要MoveNext()返回true,就一直迴圈下去

用Current屬性訪問數組中的元素

IEnumerator enumerator = persons. GetEnumerator();
 while (enumerator.MoveNext())
 {
    Person p = (Person) enumerator.Current;
    Console.WriteLine(p);
}

2. yield語句

yield語句的兩種形式:

yield return <expression>;
yield break;

使用一個yield return語句返回集合的一個元素

包含yield語句的方法或屬性是迭代器。迭代器必須滿足以下要求

a. 返回類型必須是IEnumerableIEnumerable<T>IEnumeratorIEnumerator<T>

b. 它不能有任何ref或out參數

yield return語句不能位於try-catch快。yield return語句可以位於try-finally的try塊

try
              {
                  // ERROR: Cannot yield a value in the boday of a try block with a catch clause
                 yield return "test";
              }
             catch
             { }
 
              try
             {
                 // 
                 yield return "test again";
             }
             finally
             { }
 
             try
             { }
             finally
             { 
                 // ERROR: Cannot yield in the body of a finally clause
                yield return ""; 
             }

yield break語句可以位於try塊或catch塊,但是不能位於finally塊

下麵的例子是用yield return語句實現一個簡單集合的代碼,以及用foreach語句迭代集合

using System;
using System.Collections.Generic;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            HelloCollection helloCollection = new HelloCollection();
            foreach (string s in helloCollection)
            {
                Console.WriteLine(s);
                Console.ReadLine();
            }
        }
    }

    public class HelloCollection
    {
        
        public IEnumerator<String> GetEnumerator()
        {
            // yield return語句返回集合的一個元素,並移動到下一個元素上;yield break可以停止迭代
            yield return "Hello";
            yield return "World";
        }
    }
}

使用yield return語句實現以不同方式迭代集合的類:

using System;
using System.Collections.Generic;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            MusicTitles titles = new MusicTitles();
            foreach (string title in titles)
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();

            foreach (string title in titles.Reverse())
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();

            foreach (string title in titles.Subset(2, 2))
            {
                Console.WriteLine(title);
                Console.ReadLine();
            }
        }
    }

    public class MusicTitles
    {
        string[] names = { "a", "b", "c", "d" };
        public IEnumerator<string> GetEnumerator()
        {
            for (int i = 0; i < 4; i++)
            {
                yield return names[i];
            }
        }

        public IEnumerable<string> Reverse()
        {
            for (int i = 3; i >= 0; i--)
            {
                yield return names[i];
            }
        }

        public IEnumerable<string> Subset(int index, int length)
        {
            for (int i = index; i < index + length; i++)
            {
                yield return names[i];
            }
        }
    }
}

以上動圖由“圖鬥羅”提供


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在應用程式獲取視頻數據的流程中,都是通過 ioctl 命令與驅動程式進行交互,常見的 ioctl 命令有: 1 VIDIOC_QUERYCAP /* 獲取設備支持的操作 */ 2 VIDIOC_G_FMT /* 獲取設置支持的視頻格式 */ 3 VIDIOC_S_FMT /* 設置捕獲視頻的格式 * ...
  • 設置密碼 設置時間 註意大小寫 顯示文件類型 查看文件 查看歷史命令記錄 獲取幫助 pinfo 查看textinfo's GNU文檔系統 ...
  • shell shell命令分為兩種:分別是內部命令和外部命令。 Linux中,預設的shell是bash 系統中的shell 控制台的名詞: 標準Linux命令: bash組合鍵: ...
  • windows 7安裝 準備 1、iso系統鏡像文件(我一般選用純凈版) 2、Windows7-USB-DVD-Download-Tool-Installer-en-US(啟動盤製作) 3、準備4G以上空U盤,之後的過程中會被格式化,不要放重要文件 4、C盤(系統盤)留有8G以上空間 5、備份網卡驅 ...
  • ...
  • 轉載需註明來源:http://www.cnblogs.com/yczcc/p/7594322.html openssl官網:https://www.openssl.org 下載源碼 源碼地址為:https://www.openssl.org/source/old/;當前最新版本為 1.1.0f,ht ...
  • 創建LVM分區: 相關命令: pvcreat /dev/sdb{1,2,3} 創建物理捲 vgcreat test_vg1 /dev/sdb1 創建捲組 vgcreat test_vg2 -s 16M /dev/sdb2 /dev/sdb3 指定PE大小為16M lvcreat 在已存在的捲組中創建 ...
  • 自己挖了一個大坑,,,然後苦逼的在碼代碼重寫樣式! 廢物不多少 直接上代碼 先在前臺創建一個TextBox,然後各種附加的屬性加上去:如圖所示 效果圖: 樣式代碼: 本文原創出處:http://www.cnblogs.com/PettyHandSome/ 歡迎各位轉載,但是未經作者本人同意,轉載文章 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...