C# 面试题 目录

C# 中如何实现自定义集合类并支持 foreach 循环?

推荐答案

在 C# 中,要实现自定义集合类并支持 foreach 循环,需要实现 IEnumerable 接口或 IEnumerable<T> 泛型接口。以下是实现自定义集合类并支持 foreach 循环的示例代码:

-- -------------------- ---- -------
----- -------
----- -------------------

------ ----- ------------ - -----------
-
    ------- ----- -------

    ------ ------------------ ------
    -
        ------ - ------
    -

    ------ ----------- ---------------
    -
        ------ --- ---------------------
    -

    ------- ----- ------------ - -----------
    -
        ------- ----- -------
        ------- --- ------ - ---

        ------ ------------------ ------
        -
            ------ - ------
        -

        ------ ------ -------
        -
            ---
            -
                -- ------- -- -- -- ------ -- --------------
                -
                    ----- --- ----------------------------
                -
                ------ ---------------
            -
        -

        ------ ---- ----------
        -
            ---------
            ------ ------ - --------------
        -

        ------ ---- -------
        -
            ------ - ---
        -
    -
-

----- -------
-
    ------ ---- ------
    -
        ----- ------- - - -- -- -- -- - --
        ------------ ------------ - --- ----------------------

        ------- ---- ---- -- -------------
        -
            ------------------------
        -
    -
-

本题详细解读

1. 实现 IEnumerable 接口

IEnumerable 接口是 C# 中所有集合类的基础接口。它定义了一个方法 GetEnumerator(),该方法返回一个 IEnumerator 对象。IEnumerator 对象用于遍历集合中的元素。

2. 实现 IEnumerator 接口

IEnumerator 接口定义了三个成员:

  • Current:获取集合中的当前元素。
  • MoveNext():将枚举器推进到集合的下一个元素。
  • Reset():将枚举器设置为其初始位置,即集合的第一个元素之前。

3. 自定义集合类

在自定义集合类中,我们实现了 IEnumerable 接口,并在 GetEnumerator() 方法中返回一个自定义的 IEnumerator 对象。这个自定义的 IEnumerator 对象负责遍历集合中的元素。

4. 使用 foreach 循环

foreach 循环依赖于 IEnumerable 接口。当你在自定义集合类上使用 foreach 循环时,C# 编译器会自动调用 GetEnumerator() 方法来获取枚举器,并使用该枚举器遍历集合中的元素。

5. 泛型版本

如果你希望自定义集合类支持泛型,可以实现 IEnumerable<T> 接口。IEnumerable<T> 接口与 IEnumerable 接口类似,但它返回的是 IEnumerator<T> 对象,而不是 IEnumerator 对象。IEnumerator<T> 接口提供了类型安全的 Current 属性。

-- -------------------- ---- -------
----- -------
----- -------------------
----- ---------------------------

------ ----- --------------- - --------------
-
    ------- --- -------

    ------ ---------------- ------
    -
        ------ - ------
    -

    ------ -------------- ---------------
    -
        ------ --- ---------------------
    -

    ----------- ---------------------------
    -
        ------ ----------------
    -

    ------- ----- ------------ - --------------
    -
        ------- --- -------
        ------- --- ------ - ---

        ------ ---------------- ------
        -
            ------ - ------
        -

        ------ - -------
        -
            ---
            -
                -- ------- -- -- -- ------ -- --------------
                -
                    ----- --- ----------------------------
                -
                ------ ---------------
            -
        -

        ------ ------------------- -- --------

        ------ ---- ----------
        -
            ---------
            ------ ------ - --------------
        -

        ------ ---- -------
        -
            ------ - ---
        -

        ------ ---- ---------
        -
            -- ------------------
        -
    -
-

----- -------
-
    ------ ---- ------
    -
        ----- ------- - - -- -- -- -- - --
        ----------------- ------------ - --- ---------------------------

        ------- ---- ---- -- -------------
        -
            ------------------------
        -
    -
-

在这个泛型版本中,MyCollection<T> 类实现了 IEnumerable<T> 接口,并且 MyEnumerator 类实现了 IEnumerator<T> 接口。这使得集合类可以支持类型安全的遍历。

纠错
反馈