📜  ienumerable for each - C# (1)

📅  最后修改于: 2023-12-03 14:42:03.197000             🧑  作者: Mango

IEnumerableforeach - C#

介绍

在C#中,IEnumerable 接口和 foreach 循环结合在一起被广泛用于遍历集合和序列。IEnumerable 接口提供一种通用的方式来表示通过迭代器访问集合的枚举功能。foreach 循环则是一个用于简化遍历 IEnumerable 对象的语法糖。

在本文中,我们将深入了解 IEnumerable 接口和 foreach 循环的作用、用法和相关注意事项。

IEnumerable 接口

IEnumerable 接口定义了一个方法 GetEnumerator(),该方法返回一个实现了 IEnumerator 接口的对象。通过该对象,我们可以逐个访问集合中的元素。

public interface IEnumerable
{
    IEnumerator GetEnumerator();
}
IEnumerator 接口

IEnumerator 接口定义了用于在集合上进行迭代的方法和属性。它包含三个主要的成员:

  • MoveNext():将迭代器移动到集合的下一个元素。如果成功移动到下一个元素,则返回 true,否则返回 false
  • Reset():将迭代器重置为集合的起始位置。
  • Current:获取迭代器当前位置的元素。
public interface IEnumerator
{
    bool MoveNext();
    void Reset();
    object Current { get; }
}
foreach 循环

foreach 循环提供了一种便捷的语法用于遍历实现了 IEnumerable 接口的对象。在每次迭代中,foreach 循环都会调用 GetEnumerator() 方法获取一个 IEnumerator 对象,并在循环内部使用它来访问集合中的元素。

下面是一个使用 foreach 循环遍历集合的示例:

foreach (var item in collection)
{
    // 对每个元素执行操作
}
Example

接下来,我们将通过一个示例来演示如何使用 IEnumerable 接口和 foreach 循环。

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        // 创建一个字符串集合
        StringCollection collection = new StringCollection();
        collection.Add("Apple");
        collection.Add("Banana");
        collection.Add("Cherry");

        // 使用 foreach 循环遍历集合
        foreach (var item in collection)
        {
            Console.WriteLine(item);
        }
    }
}

// StringCollection 类实现了 IEnumerable 接口
class StringCollection : IEnumerable
{
    private readonly string[] items = new string[3];

    public void Add(string item)
    {
        for (int i = 0; i < items.Length; i++)
        {
            if (items[i] == null)
            {
                items[i] = item;
                break;
            }
        }
    }

    public IEnumerator GetEnumerator()
    {
        return new StringEnumerator(items);
    }
}

class StringEnumerator : IEnumerator
{
    private readonly string[] items;
    private int position = -1;

    public StringEnumerator(string[] items)
    {
        this.items = items;
    }

    public object Current => items[position];

    public bool MoveNext()
    {
        position++;
        return position < items.Length;
    }

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

上述示例中,我们创建了一个 StringCollection 类实现了 IEnumerable 接口,并在其中使用数组来存储字符串集合。然后,我们使用 foreach 循环遍历该集合,并打印出每个元素的值。

请注意,在实现 IEnumerable 接口时,我们必须提供一个类似 GetEnumerator() 的方法来返回一个实现了 IEnumerator 接口的对象,该对象负责迭代集合中的元素。

结论

在C#中,IEnumerable 接口和 foreach 循环为程序员提供了一种方便的方式来遍历集合和序列。通过实现 IEnumerable 接口和 IEnumerator 接口,我们可以自定义集合类并使用 foreach 循环遍历其中的元素。

这种方法在处理集合和序列时非常常见,因此对于每个C#开发人员来说,掌握 IEnumerableforeach 是至关重要的。

代码片段的 markdown 标记如下:

```csharp
// 你的代码