ว่าด้วยเรื่อง IEnumerator, IEnumerable และ ICloneable

23 Aug 2016,
Share: 

บทความนี้ จะมาพูดถึง interface 3 ตัวนี้ IEnumerator, IEnumerable และ ICloneable ซึ่ง .net เตรียมไว้ให้เราไว้ใช้งาน โดยมีรายละเอียดดังนี้

IEnumerator

เป็น interface พื้นฐานเพื่อให้ class ที่อ้างถึง interface นี้สามารถใช้ foreach ได้ ภายในประกอบไปด้วย

  • Method
    • MoveNext ระบุให้เลื่อน element ปัจจุบันไป 1 ช่อง
    • Reset สังให้ current กลับไปจุดเริ่มต้น
  • Properties
    • Current ดึง element ปัจจุบันจาก collection

ตัวอย่าง เราจะสร้าง class Month ที่จะใช้งานกับ foreach ได้  โดยเราต้องสร้าง Class Month ที่ inherited interface IEnumerable แล้ว implement method GetEnumerator() โดยเราจะต้อง return เป็น class ที่ inherited interface IEnumerator ตามตัวอย่าง source code ดังนี้

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

namespace IEnumeratorExample {
    class Program {
        static void Main(string[] args) {

            Month objMonth = new Month();

            foreach (string item in objMonth) {
                Console.WriteLine(item);
            }

            Console.ReadKey();

        }
    }

    class Month : IEnumerable {

        public string[] arrMonth = new string[] { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };

        public IEnumerator GetEnumerator() {
            return new AllMonth(this);
        }
    }

    class AllMonth : IEnumerator {

        private Month _month;
        private int index = -1;

        public AllMonth(Month inMonth) {
            _month = inMonth;
        }

        public object Current {
            get {
                return _month.arrMonth[index];
            }
        }

        public bool MoveNext() {
            index++;
            if (index < _month.arrMonth.Length) {
                return true;
            } else {
                return false;
            }
        }

        public void Reset() {
            index = -1;
        }
    }
}

จะได้ผลลัพธ์ดังนี้

Image

download source code

IEnumerable

เป็น interface ที่จะทำการส่งคลาส IEnumerator ไปยังคำสั่ง foreach ภายในมีสมาชิกดังนี้

  • Method
    • GetEnumerator ส่งค่า enumerator ที่จะส่งไปยัง foreach

ตัวอย่าง ตัวอย่างนี้ผมจะสร้าง function ที่ return ค่าเป็นประเภท IEnumerable ในตัวอย่างนี้ผมใช้ yield ซึ่ง yield ใน C# จะถูกใช้ใน method ที่ return type IEnumerable

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

namespace IEnumerableExample {
    class Program {
        static void Main(string[] args) {

            foreach (int item in getNumber()) {
                Console.WriteLine("Number from getNumber(): " + item.ToString());
            }

            Console.ReadKey();

        }

        private static IEnumerable<int> getNumber() {
            yield return 1;
            yield return 2;
            yield return 3;
            yield return 4;
            yield return 5;
            yield return 6;
            yield return 7;
            yield return 8;
            yield return 9;
            yield return 10;
        }
    }
}

จะได้ผลลัพธ์ดังนี้

Image

download source code

ICloneable

เป็น interface ที่กำหนดให้คลาสที่ประกาศต้องมีความสามารถในการ clone ตัวมันเอง

  • Method
    • Clone ทำการ clone ตัวมันเองแล้วส่งค่านั้นกลับไป

ตัวอย่าง ตัวอย่างเราจะสร้าง class ที่เก็บตัวเลข และสามารถ Clone ตัวเองได้ เขียนด้วยภาษา C# ดังนี้

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

namespace ICloneableExample {
    class Program {
        static void Main(string[] args) {
            myNumber obj1, obj2;

            obj1 = new myNumber(1);
            obj2 = (myNumber)obj1.Clone();

            obj1.number = 90;

            Console.WriteLine("obj1 number: " + obj1.number.ToString());
            Console.WriteLine("obj2 number: " + obj2.number.ToString());

            Console.ReadKey();
        }
    }

    class myNumber : ICloneable {

        private int _number = 0;

        public int number { get { return _number; } set { _number = value; } }

        public myNumber(int inNumber) {
            _number = inNumber;
        }

        public object Clone() {
            return new myNumber(_number);
        }
    }
}

จะได้ผลลัพธ์ดังนี้

Image

download source code

Suggestion blogs

หนังสือเดินทางท่องเที่ยว อุทยานแห่งชาติ (Passport)

เป็น passport สำหรับการท่องเที่ยวอุทยานแห่งชาติในเมืองไทย จัดทำขึ้นโดย ส่วนนันทนาการและสื่อความหมาย สำนักอุทยานแห่งชาติ กรมอุทยานแห่งชาติ สัตว์ป่า และพืชพันธ์ สามารถหาซื้อได้จากที่ทำการอุทยานแห่งชาติทุกที่ แต่ค่อนข้างหาซื้อยากครับเนื่องจากปีนึงจะจัดทำขึ้นปีละไม่กี่พันเล่ม

Arduino ตอน6 Serial interface ใน Arduino

Serial เป็นรูปแบบการสื่อสารแบบ Asynchronous ชนิดหนึ่งที่ Arduino นํามาใช้ในการสื่อสารกับ Device อื่นๆ เช่น Computer, Arduino, Module Sensor ต่างๆ หรืออุปกรณ์อะไรก็ตามที่รองรับการส่งข้อมูลแบบ Serial สําหรับข้อมูลเพิ่มเติมของการสือสารแบบ Serial อ่านรายละเอียดเพิ่มเติมได้จากบนความนี้ครับ TTL UART RS232 คืออะไร

รหัสมอร์ส (Morse)

รหัสมอร์สคืออะไร?รหัสมอร์สคือ รูปแบบการส่งข่าวสารทางโทรเลข ข่าวสารที่ติดต่อสื่อสารสามารถเป็นได้ทั้งตัวอักษร ตัวเลข สัญลักษณ์ (รวมเรียกว่าอักขระ) ในการส่งข่าวสารนั้นจะส่งเป็นชุดสัญญาณเสียง ไฟหรือเสียงเคาะ (click) เปิด-ปิด เป็นจังหวะ สั้น-ยาว ที่แตกต่างกันในแต่ละตัวอักษร


Copyright © 2019 - 2026 thiti.dev |  v1.60.2 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Nostr   Youtube channel   Telegram   Email contact   วงแหวนเว็บ