1. 程式人生 > >C#中的列舉使用泛型介面和非泛型介面實現

C#中的列舉使用泛型介面和非泛型介面實現

        列舉相信大家都不陌生,今天又再看了下感覺有了新的收穫。下面記錄自己的程式碼:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EnumberOption
{
    /// <summary>
    /// 宣告一個列舉類
    /// </summary>
    public class MyIEnumberator
    {
        /// <summary>
        /// 迭代器返回列舉數
        /// </summary>
        public MyYield mcyield=new MyYield();
    }

    /// <summary>
    /// 非泛型介面列舉數
    /// </summary>
    public class ColorEnumberator : IEnumerator
    {
        string[] Colors;//實現IEnumberator
        /// <summary>
        /// 索引位置
        /// </summary>
        int Postion = -1;
        /// <summary>
        /// 當前元素
        /// </summary>
        public object Current
        {
            get
            {
                if (Postion == -1)
                {
                    throw new InvalidOperationException();
                }
                if (Postion == Colors.Length)
                {
                    throw new InvalidOperationException();
                }
                return Colors[Postion];
            }
        }

        /// <summary>
        /// 移動到下一個元素
        /// </summary>
        /// <returns></returns>
        public bool MoveNext()
        {
            if (Postion < Colors.Length - 1)
            {
                Postion++;
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 重置
        /// </summary>
        public void Reset()
        {
            Postion = -1;
        }

        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="theColors"></param>
        public ColorEnumberator(string[] theColors)
        {
            Colors = new string[theColors.Length];
            for (int i = 0; i < theColors.Length; i++)
            {
                Colors[i] = theColors[i];
            }
        }
    }

    /// <summary>
    /// 泛型列舉數介面實現ColorEnumerator
    /// </summary>
    public class ColorEnumberatorList : IEnumerator<String>
    {
        string[] Colors;
        int Position = -1;
        /// <summary>
        /// 當前元素 泛型
        /// </summary>
        public string Current
        {
            get
            {
                return Colors[Position];
            }
        }

        /// <summary>
        /// 顯示實現Current 非泛型
        /// </summary>
        object IEnumerator.Current
        {
            get { return Colors[Position];}
        }

        /// <summary>
        /// 移動到下一個
        /// </summary>
        /// <returns></returns>
        public bool MoveNext()
        {
            if (Position < Colors.Length - 1)
            {
                Position++;
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 重置
        /// </summary>
        public void Reset()
        {
            Position = -1;
        }

        /// <summary>
        /// 銷燬操作
        /// </summary>
        public void Dispose()
        {
        }

        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="theColors"></param>
        public ColorEnumberatorList(string[] theColors)
        {
            Colors = new string[theColors.Length];
            for (int i = 0; i < theColors.Length; i++)
            {
                Colors[i] = theColors[i];
            }
        }
    }
}

using EnumberOption;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ImageBookCode.Enumerator
{
    /// <summary>
    /// 非泛型實現
    /// </summary>
    public class MyColors:IEnumerable
    {
        string[] Colors ;

        /// <summary>
        /// ColorEnumberator實現了IEnumerator
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            return new ColorEnumberator(Colors);
        }

        /// <summary>
        /// 建構函式
        /// </summary>
        /// <param name="theColors"></param>
        public MyColors(string[] theColors)
        {
            Colors = new string[theColors.Length];
            for (int i = 0; i < theColors.Length; i++)
            {
                Colors[i] = theColors[i];
            }
        }

        /// <summary>
        /// 無參建構函式
        /// </summary>
        public MyColors()
        {
            Colors = new string[3];
            Colors[0] = "Red";
            Colors[1] = "Yellow";
            Colors[2] = "Blue";
        }
    }

    /// <summary>
    /// 泛型實現
    /// </summary>
    public class MyColorsList : IEnumerable<string>
    {
        string[] Colors = { "Red", "Yellow", "Blue" };
        /// <summary>
        /// IEnumerable<T>版本"
        /// </summary>
        /// <returns></returns>
        public IEnumerator<string> GetEnumerator()
        {
            return new ColorEnumberatorList(Colors);
        }

        /// <summary>
        /// 顯示實現 IEnumerable版本
        /// </summary>
        /// <returns></returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return new ColorEnumberatorList(Colors);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EnumberOption
{
    /// <summary>
    /// 使用迭代器
    /// </summary>
    public class MyYield
    {
        /// <summary>
        /// 返回列舉數
        /// </summary>
        /// <returns></returns>
        public IEnumerator<string> GetEnumerator()
        {
            ////返回列舉數
            return BlackAndWhite();
        }

        /// <summary>
        /// 迭代器
        /// </summary>
        /// <returns></returns>
        public IEnumerator<string> BlackAndWhite()
        {
            yield return "black";
            yield return "gray";
            yield return "white";
        }
    }
}

using EnumberOption;
using ImageBookCode.Enumerator;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ImageBookCode
{
    class Program
    {
        static void Main(string[] args)
        {
            ////實現介面的列舉數
            MyColors mc = new MyColors();
            foreach (var item in mc)
            {
                Console.WriteLine(item);
            }
            ////使用泛型介面實現的列舉數
            MyColorsList mcl = new MyColorsList();
            foreach (var color in mcl)
            {
                Console.WriteLine(color);
            }
            ////使用迭代器返回列舉數
            MyIEnumberator IEnumberColorYield = new MyIEnumberator();
            foreach (var itemIEnum in IEnumberColorYield.mcyield)
            {
                Console.WriteLine(itemIEnum);
            }
            Console.ReadKey();
        }
    }
}

程式碼打包下載點選這裡 開發環境:VS2013

相關推薦

C#列舉使用介面介面實現

        列舉相信大家都不陌生,今天又再看了下感覺有了新的收穫。下面記錄自己的程式碼: using System; using System.Collections; using System.Collections.Generic; using System.Li

集合集合的區別

但是 array 存儲 數據類型的轉換 是的 array對象 編譯期 都沒有 nbsp 他們倆個,一個是弱類型,一個是強類型。 而弱類型是指無法在應用程序編譯期間得到檢查,如array對象,你可以往這個對象中添加數字和字符都沒有問題。但是在遍歷操作的時候可能會牽扯到數據類型

關於正則表示式——捕獲括號捕獲括號

對於括號中的子表示式,正則表示式會將匹配的子表示式進行儲存。 <pre class="javascript" name="code">var regular = /^Subject:(\d)/ var str = "Subject:1 as something"

檢查異常檢查異常

對於因為程式設計錯誤而導致的異常,或者是不能期望程式捕獲的異常(解除引用一個空指標,陣列越界,除零,等等),為了使開發人員免於處理這些異常,一些異常被命名為非檢查型異常(即那些繼承自 RuntimeException 的異常)並且不需要進行宣告。 Checked Excep

C語言編程 遞歸遞歸分別實現strlen

累加 pri 一次 字符 長度 當前 次數 result pau <1>非遞歸基本思想:依次讀字符串的每一位,若不是\0則累加器++源代碼: #include<stdio.h> #include<stdlib.h> int Mystrle

C語言編程 遞歸遞歸分別實現求n的階乘

改變 amp int 思想 log 累乘 lib 計算 https <1>非遞歸主要思想是設計累乘器,通過對自身每一次改變的乘積就是結果 #include<stdio.h> #include<stdlib.h> int main() {

C介面繼承多

 上一節中我們學習到了建構函式,用來初始化一個物件的例項。同時在.NET Framework中,提供了解構函式用於清理物件。一般情況下不需要特別解構函式,系統會自動提供預設的解構函式來執行操作,清理不再需要的物件。 一、 靜態和例項類成員 屬性,方法和欄位等成員是物件例項所

十二、事件,委托,委托,集合(),Lambda表達式(聲明委托,使用委托,簡單的委托示例,action<T>func<t>委托,多播委托,匿名方法,Lambda表達式,參數,事件)

multicast new 調用方法 多播 ted 被調用 輸入參數 pac cas 事件(Event) 事件是一種對象或類能夠提供通知的成員,客戶端可以通過提供事件處理程序為相應的事件可添加可執行代碼,事件可以理解為一種特殊的委托。 委托(Delegate) 委托是存有對

c#的裏氏轉換Java強制類轉換在多態的應用

readline color extends pre pri console AS 定義 spa 在c#中: 註意: 子類並沒有繼承父類的構造函數,而是會默認調用父類那個無參數的構造函數。 如果一個子類繼承了一個父類,那麽這個子類除了可以使用自己的成員外,還可以使用從父類

C#集合與集合(轉)

轉自部落格: http://www.cnblogs.com/zhxhdean/archive/2011/05/18/2050186.html 在.NET平臺最初發布時,程式設計師使用System.Collections名稱空間下的ArrayList,HashTable,Queue,S

C++對純虛擬函式的理解

    抽象類是一種特殊的類,它是為了抽象和設計的目的為建立的,它處於繼承層次結構的較上層。       ⑴抽象類的定義:       稱帶有純虛擬函式的類為抽象類。       ⑵抽象類的作用:       抽象類的主要作用是將有關的操作作為結果介面組織在

為什麼C++常量引用可以繫結常量的物件、字面值一般表示式 詳解

    在c++語言中,除兩種例外情況,其他引用的型別都要和與之繫結的物件嚴格匹配,如int型的引用只能繫結int型的物件;並且引用不能直接與字面值常量或表示式結果繫結。    其中一種例外情況是:初始化常量引用時,允許用任意表達式作為初始值,只要該表示式的結果能轉換成引用的

C++編譯期多機制執行期多機制之間的區別

函式由函式名、引數個數、引數型別、返回值和呼叫方式等組成。 函式簽名:把函式名去掉之後函式的剩餘部分(引數個數、引數型別、返回值和呼叫方式等)。 頂層函式:在類之外宣告並定義的函式稱為頂層函式。 成員函式:在類的宣告中宣告的函式稱為類的成員函式。 過載:如果頂層函式有不同

C++關於[]靜態數組new分配的動態數組的區別分析

zid dad ima lin aer uem asa iba ash %E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3java%E8%99%9A%E6%8B%9F%E6%9C%BA7---%E7%BA%BF%E7%A8%8B%E5%AE%89%E5

C#數組、ArrayListList三者的區別

collect comm 兩個 根據 -s lis 數據打包 功能 target 在C#中數組,ArrayList,List都能夠存儲一組對象,那麽這三者到底有什麽樣的區別呢。 數組 數組在C#中最早出現的。在內存中是連續存儲的,所以它的索引速度非常快,而且賦值

C#的 具名參數 可選參數

調用方法 4.0 frame framework 必須 遇到 錯誤 方法 public 具名參數 和 可選參數 是 C# framework 4.0 出來的新特性。 一. 常規方法定義及調用 public void Demo1(string x, int y) {

c#的托管代碼托管代碼的理解

ont 線程管理 安全 本機 有一個 自己 垃圾 相關 spa 理解托管和非托管代碼的前提之下,要先了解CLR(公共語言運行庫) .Net Framework 是由彼此獨立又相關的兩部分組成:CLR 和 類庫, CLR是它為我們提供的服務,類庫是它實現的功能. .NET

C# 面向對象3 靜態靜態的區別

一個 允許 如果 class 共享 靜態函數 區別 回收 body 靜態和非靜態的區別 1.在非靜態類中,既可以有實例成員(非靜態成員),也可以有靜態成員. 2.在調用實例成員的時候,需要使用對象名.實例成員; 在調用靜態成員的時候,需要使用類名.靜態成員名; 總結:

數據結構 遞歸遞歸方式實現二叉樹先序、後序遍歷

nor post 後序遍歷 order else 對象 二叉樹先序 bre print   二叉樹的先序遍歷順序是根、左、右;中序遍歷順序是左、根、右;後序遍歷順序是左、右、根。   遞歸方式實現如下: 1 public class TreeNode { 2

C#重寫(override)覆蓋(new)的區別

實現 div del end 抽象方法 ring reg strong AR 重寫 用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。