欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中IEnumerator<T>和IEnumerable的區(qū)別

 更新時(shí)間:2024年01月24日 16:32:36   作者:周杰倫fans  
在C#中,IEnumerator<T>和IEnumerable是用于實(shí)現(xiàn)迭代的接口,本文主要介紹了C#中IEnumerator<T>和IEnumerable的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下

在 C# 中,IEnumerator<T> 和 IEnumerable 是用于實(shí)現(xiàn)迭代的接口。它們的區(qū)別在于它們的功能和使用方式。

IEnumerable 接口表示一個(gè)可枚舉的集合,它定義了一個(gè)方法 GetEnumerator(),該方法返回一個(gè)實(shí)現(xiàn)了 IEnumerator 接口的對(duì)象。這意味著類型實(shí)現(xiàn)了 IEnumerable 接口,它可以提供一個(gè)迭代器,用于按順序訪問集合中的元素。IEnumerable 接口是只讀的,它只能支持前向迭代,不能修改集合中的元素。

IEnumerator<T> 接口是泛型版本的迭代器接口,它繼承自 IEnumerator 接口,并增加了一個(gè) Current 屬性,用于獲取集合中當(dāng)前位置的元素。IEnumerator<T> 接口定義了以下方法和屬性:

  • bool MoveNext():將迭代器移動(dòng)到集合的下一個(gè)元素,如果成功移動(dòng)到下一個(gè)元素則返回 true,否則返回 false
  • void Reset():將迭代器重置到集合的起始位置。
  • T Current:獲取集合中當(dāng)前位置的元素。

通過實(shí)現(xiàn) IEnumerator<T> 接口,可以創(chuàng)建一個(gè)能夠迭代訪問泛型集合中元素的迭代器。

下面是一個(gè)示例,演示了 IEnumerable 和 IEnumerator<T> 的用法和區(qū)別:

using System;
using System.Collections;
using System.Collections.Generic;

public class MyCollection<T> : IEnumerable<T>
{
    private List<T> items = new List<T>();

    public void Add(T item)
    {
        items.Add(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return new MyEnumerator<T>(items);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class MyEnumerator<T> : IEnumerator<T>
{
    private List<T> items;
    private int currentIndex = -1;

    public MyEnumerator(List<T> items)
    {
        this.items = items;
    }

    public bool MoveNext()
    {
        currentIndex++;
        return currentIndex < items.Count;
    }

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

    public T Current
    {
        get { return items[currentIndex]; }
    }

    object IEnumerator.Current
    {
        get { return Current; }
    }

    public void Dispose()
    {
        // 不需要實(shí)現(xiàn)
    }
}

public class Program
{
    public static void Main()
    {
        MyCollection<int> collection = new MyCollection<int>();
        collection.Add(1);
        collection.Add(2);
        collection.Add(3);

        // 使用 foreach 遍歷集合
        Console.WriteLine("使用 foreach 遍歷集合:");
        foreach (int item in collection)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        // 使用迭代器手動(dòng)遍歷集合
        Console.WriteLine("使用迭代器手動(dòng)遍歷集合:");
        IEnumerator<int> enumerator = collection.GetEnumerator();
        while (enumerator.MoveNext())
        {
            int item = enumerator.Current;
            Console.WriteLine(item);
        }
    }
}

在這個(gè)示例中,我們定義了一個(gè)名為 MyCollection<T> 的泛型集合類,它實(shí)現(xiàn)了 IEnumerable<T> 接口。在 MyCollection<T> 類中,我們使用 List<T> 存儲(chǔ)集合中的元素,并實(shí)現(xiàn)了 GetEnumerator 方法,返回一個(gè)實(shí)現(xiàn)了 IEnumerator<T> 接口的迭代器。

我們還定義了一個(gè)名為 MyEnumerator<T> 的泛型迭代器類,它實(shí)現(xiàn)了 IEnumerator<T> 接口。在 MyEnumerator<T> 類中,我們使用一個(gè)索引 currentIndex 跟蹤當(dāng)前位置,并實(shí)現(xiàn)了 MoveNext 方法、Reset 方法和 Current 屬性。

在 Main 方法中,我們創(chuàng)建了一個(gè) MyCollection<int> 類型的集合實(shí)例,并向其中添加了幾個(gè)元素。然后,我們使用 foreach 循環(huán)和迭代器手動(dòng)遍歷集合,并輸出每個(gè)元素的值。

通過實(shí)現(xiàn) IEnumerable<T> 和 IEnumerator<T> 接口,我們可以在 C# 中實(shí)現(xiàn)可迭代的集合,并使用foreach 循環(huán)或手動(dòng)迭代器來訪問集合中的元素。 IEnumerator<T> 提供了更強(qiáng)大的功能,因?yàn)樗试S直接訪問當(dāng)前元素,而不需要類型轉(zhuǎn)換。

到此這篇關(guān)于C#中IEnumerator<T>和IEnumerable的區(qū)別的文章就介紹到這了,更多相關(guān)C# IEnumerator<T> IEnumerable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • C#實(shí)現(xiàn)驗(yàn)證字符串的長(zhǎng)度的方法詳解

    C#實(shí)現(xiàn)驗(yàn)證字符串的長(zhǎng)度的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何使用正則表達(dá)或者計(jì)算字符數(shù)組長(zhǎng)度或字符串的長(zhǎng)度來驗(yàn)證驗(yàn)證字符串的長(zhǎng)度,感興趣的小伙伴可以學(xué)習(xí)一下
    2024-02-02
  • C#操作Access通用類實(shí)例

    C#操作Access通用類實(shí)例

    這篇文章主要介紹了C#操作Access通用類,實(shí)例分析了C#操作access的各種常見技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-06-06
  • C#中應(yīng)用程序集的裝載過程詳解

    C#中應(yīng)用程序集的裝載過程詳解

    這篇文章主要介紹了C#中應(yīng)用程序集的裝載過程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例

    C#?Unity使用正則表達(dá)式去除部分富文本的代碼示例

    正則表達(dá)式在我們?nèi)粘i_發(fā)中的用處不用多說了吧,下面這篇文章主要給大家介紹了關(guān)于C#?Unity使用正則表達(dá)式去除部分富文本的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • c#中string的特性介紹及注意事項(xiàng)小結(jié)

    c#中string的特性介紹及注意事項(xiàng)小結(jié)

    這篇文章主要給大家介紹了關(guān)于c#中string的特性介紹及注意事項(xiàng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • c# 用ffmpeg從視頻中截圖

    c# 用ffmpeg從視頻中截圖

    這篇文章主要介紹了c# 用ffmpeg從視頻中截圖的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 積累Visual Studio 常用快捷鍵的動(dòng)畫演示

    積累Visual Studio 常用快捷鍵的動(dòng)畫演示

    在代碼開發(fā)過程中,頻繁的使用鍵盤、鼠標(biāo)操作非常麻煩,影響程序的開發(fā)效率。如何操作能用鍵盤來操作,那就節(jié)省時(shí)間了。下面小編把我平時(shí)積累的有關(guān)visul studio 常用快捷鍵的動(dòng)畫演示分享給大家,僅供大家參考
    2015-10-10
  • c#使用Dataset讀取XML文件動(dòng)態(tài)生成菜單的方法

    c#使用Dataset讀取XML文件動(dòng)態(tài)生成菜單的方法

    這篇文章主要介紹了c#使用Dataset讀取XML文件動(dòng)態(tài)生成菜單的方法,涉及C#使用Dataset操作XML文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 使用C#進(jìn)行音頻處理的完整指南(從播放到編輯)

    使用C#進(jìn)行音頻處理的完整指南(從播放到編輯)

    在現(xiàn)代應(yīng)用程序中,音頻處理已經(jīng)成為不可或缺的一部分,無論是開發(fā)一個(gè)簡(jiǎn)單的音頻播放器,還是構(gòu)建一個(gè)復(fù)雜的音頻編輯工具,C#都提供了豐富的工具和庫(kù)來實(shí)現(xiàn)這些功能,通過本文,我們將深入探索如何在C#中進(jìn)行音頻播放、錄制、編輯、格式轉(zhuǎn)換以及音頻分析
    2025-04-04
  • 最新評(píng)論