簡體   English   中英

為什么我們需要IEnumerator和IEnumerable?

[英]Why do we need IEnumerator and IEnumerable?

好的,我只是在處理IEnumeratorIEnumerable 現在MSDN說這些東西的主要目標是遍歷客戶集合。

很公平但我能夠在不使用任何一個的情況下迭代自定義集合(或者至少我想這么認為)

namespace ienumerator
{

class person
{
    public person(string first, string second)
    {
        fname = first;
        lname = second;
    }
    public string fname { get; set; }
    public string lname { get; set; }
}

class person_list
{
    public person[] list;
    public person_list(person[] per)
    {
        list = new person[per.Length];
        for (int i = 0; i < per.Length; i++)
        {
            list[i] = per[i];
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        person[] names = new person[3]
        {
            new person("some","one"),
            new person("another","one"),
            new person("sss","ssdad"),
        };

        person_list list_of_names = new person_list(names);
        int i = 0;
        while (i < list_of_names.list.Length)
        {
            Console.WriteLine(list_of_names.list[i].fname);
            i++;
        }
        Console.Read();
    }
 }
}

那么在我的理解中有什么缺陷,上面給出了我在實現IEnumeratorIEnumerable后獲得的相同結果。

然而,我可以在不使用任何一個的情況下迭代自定義集合

當然, 可以沒有界面的情況下迭代自己的集合; 如果你不能,那你將如何實現界面?

作為代碼實現者, 不會為了方便而實現接口。 您為了方便代碼的使用者而實現它。 界面意味着“關注客戶:您可以枚舉此集合的內容,而無需了解我如何實現它”。

這就是界面的目的:它提供了一種抽象,允許代碼的消費者使用它而無需了解它的工作原理。

在您的main函數中,您使用了person_list兩個方面來遍歷人員列表, Length[]運算符,用於將集合的成員person_list某個位置。

但是,如果您有一些容器或自定義集合未實現其中一個或兩個,該怎么辦? 例如,逐行讀取文件的類可能事先不知道集合的長度是多少,因此不定義Length 從隊列中讀取消息的枚舉器可能只能接受下一個,而不是一個,比如前面的四個位置[4] 在這兩種情況下,您仍然可以正確地“迭代”整個集合。

IEnumeratorIEnumerable完全需要foreach工作所需的屬性而不需要其他屬性,這就是為什么函數可以將它們用作需求,因為它們知道它們能夠遍歷它們傳遞的任何類型的集合。

您當然可以迭代自定義集合而無需實現IEnumerable接口,但迭代代碼必須知道您的自定義集合。

如果實現IEnumerable ,則迭代所有元素的代碼不需要知道您的person_list類。 它使用一個實現IEnumerable 的實例,如果你將實際的實例交換為后來也實現IEnumerable其他東西,它仍然可以工作。

實際上,在C#中,不需要實現IEnumerableIEnumerator來自定義您自己的集合。 如果您使用適合您的傳統方式迭代集合,但如果您使用foreach迭代集合則會遇到麻煩。

另一個原因,如果你想暴露你的類以便VB.NET用戶可以使用你應該考慮實現這兩個接口。

請注意, IEnumerable在非泛型和泛型集合中是不同的。 非泛型屬於System.Collection ,另一個屬於System.Collection.Generic命名空間

有很多方法可以迭代自定義序列。 一種方法是使用迭代器設計模式

Iterator模式用於統一遍歷自定義序列(它可以是內存中的集合,生成集合或其他內容)。 在.NET世界中,這種模式以下列方式實現:我們有一個可迭代的對象,它實現了IEnumerable接口(這向你的班級的任何客戶展示了你有能力遍歷你的內容)。

我們有一個迭代器本身(實現IEnumerator接口的對象),您可以將其視為可迭代對象中當前位置的“指針”。 因為您可能有內部循環(即一次在同一個對象上進行多次迭代),您必須從迭代器中拆分可迭代對象。

基本上有很多方法可以遍歷特定的序列,但是迭代器模式使您能夠“概括”這種方法,從實現中的調用者隱藏遍歷算法的特定實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM