当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在C#中的自定义对象上使用foreach关键字》经验,为你挑选了2个好方法。

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



1> Jon Skeet..:

鉴于标签,我认为你的意思是在.NET中 - 我会选择谈论C#,因为这就是我所知道的.

foreach声明(通常)使用IEnumerableIEnumerator或他们的共通表兄弟.表格声明:

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

其中source器具IEnumerable大致等效于:

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

请注意,IEnumerator它位于末尾,但语句退出.这对于迭代器块很重要.

要实现IEnumerableIEnumerator自己,最简单的方法是使用迭代器块.而不是在这里写下所有细节,最好只是引用你到深度C#的第6章,这是一个免费下载.整个第6章是关于迭代器的.我在深度网站上的C#上还有另外两篇文章:

迭代器,迭代器块和数据管道

迭代器块实现细节

作为一个简单的例子:

public IEnumerable 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类型,您可以执行以下操作:

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

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



2> Mats Fredrik..:

(我在这里假设C#)

如果您有自定义对象列表,则可以像使用任何其他对象一样使用foreach:

List myObjects = // something
foreach(MyObject myObject in myObjects)
{
     // Do something nifty here
}

如果你想创建自己的容器,可以使用yield关键字(从.Net 2.0及以上我相信)和IEnumerable接口.

class MyContainer : IEnumerable
{
    private int max = 0;
    public MyContainer(int max)
    {
        this.max = max;
    }

    public IEnumerator GetEnumerator()
    {
        for(int i = 0; i < max; ++i)
            yield return i;
    }

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

然后将它与foreach一起使用:

MyContainer myContainer = new MyContainer(10);
foreach(int i in myContainer)
    Console.WriteLine(i);

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有