c# - 如何在 C# 中的自定义对象上使用 foreach 关键字

标签 c# foreach

有人可以分享一个将 foreach 关键字用于自定义对象的简单示例吗?

最佳答案

根据标签,我假设您指的是 .NET - 我将选择谈论 C#,因为这是我所知道的。

foreach语句(通常)使用 IEnumerableIEnumerator或他们的普通表亲。形式的声明:

foreach (Foo element in source)
{
    // Body
}

哪里source工具 IEnumerable<Foo> 大致相当于:

using (IEnumerator<Foo> iterator = source.GetEnumerator())
{
    Foo element;
    while (iterator.MoveNext())
    {
        element = iterator.Current;
        // Body
    }
}

请注意 IEnumerator<Foo>在最后处理,但是语句存在。这对于迭代器 block 很重要。

实现IEnumerable<T>IEnumerator<T>你自己,最简单的方法是使用迭代器 block 。与其在此处写下所有详细信息,不如将您推荐给 chapter 6 of C# in Depth 可能是最好的选择,这是一个免费下载。整个第 6 章都是关于迭代器的。我的 C# in Depth 站点上还有另外几篇文章:

举个简单的例子:

public IEnumerable<int> EvenNumbers0To10()
{
    for (int i=0; i <= 10; i += 2)
    {
        yield return i;
    }
}

// Later
foreach (int x in EvenNumbers0To10())
{
    Console.WriteLine(x); // 0, 2, 4, 6, 8, 10
}

实现IEnumerable<T>对于类型,您可以执行以下操作:

public class Foo : IEnumerable<string>
{
    public IEnumerator<string> GetEnumerator()
    {
        yield return "x";
        yield return "y";
    }

    // Explicit interface implementation for nongeneric interface
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator(); // Just return the generic version
    }
}

关于c# - 如何在 C# 中的自定义对象上使用 foreach 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/348964/

相关文章:

java - 为什么java数字不可迭代

c# - 创建预定义的 JsonConvert 属性?

c# - 在 BackgroundWorker 忙时禁用表单?

C#窗口窗体的透明背景

powershell - 从两个对象创建对象的最佳方式

java - EL 内部 c :foreach are not evaluated

php - foreach函数从mysql db创建数组

c# - DevExpress 皮肤不工作

c# - ToList() 可以更改列表中项目的顺序吗?

angularjs - 在 AngularJS forEach 中添加延迟