我是靠谱客的博主 害怕飞机,最近开发中收集的这篇文章主要介绍能用foreach遍历访问的对象需要实现____接口或声明____方法的类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

之前面试看到一个这样的笔试题,当时只知道List和Dictionary类型可以用foreach遍历,但他两也没什么共同点啊。List是有序的,但Dictionary是无序的。回来在网上查了下才发现,他们都实现了IEnumerable接口,申明了GetEnumerator方法。打开源码后发现确实如此:

接下来就详细写一下自定义的类如果用foreach遍历。

首先定义一个Item类

public class Item
{
    public int Id;
    public string Name;
    public int Price;

    public Item(int id, string name, int price)
    {
        Id = id;
        Name = name;
        Price = price;
    }
}

接下来要写的类就是暴漏给外部调用,实现了IEnumerable的ItemList.

public class ItemList : IEnumerable
{
    private Item[] items;

    public int Count
    {
        get { return items.Length; }
    }

    public ItemList(Item[] _items)
    {
        items = _items;
    }
    public Item this[int index]
    {
        get { return items[index]; }
    }
    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < items.Length; i++)
        {
            yield return items[i];
        }
    }
    //public IEnumerator GetEnumerator()
    //{
    //    return items.GetEnumerator();
    //}
}

这里可以不实现IEnumerable接口,但是GetEnumerator方法必须申明,不然在调用时会报错。而GetEnumerator方法,这里写了前两种方法。一种是通过for循环依次返回,一种是因为[]本身就实现了IEnumerable,所有可以直接用它的GetEnumerator。

然后写一个测试代码:

ItemList itemList=new ItemList(new Item[]{new Item(1,"apple",3),new Item(2,"banana",3)  });
        foreach (Item item in itemList)
        {
            Debug.Log(item.Id+"__"+item.Name+"__"+item.Price);
        }

这样就可以通过foreach遍历自己写的ItemList类了。

还有第三种方法,就是自己重写一个实现IEnumerator的类

public class ItemListEnumerator : IEnumerator
{
    private int index = -1;
    private ItemList itemList;

    public ItemListEnumerator(ItemList _itemList)
    {
        itemList = _itemList;
    }

    public object Current
    {
        get { return itemList[index]; }
    }

    public bool MoveNext()
    {
        index++;
        return index < itemList.Count;
    }

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

然后修改ItemList中的GetEnumerator方法

  public IEnumerator GetEnumerator()
    {
       return new ItemListEnumerator(this);
    }

至此让一个自定义类可以被foreach遍历的三种方法都有了。而写到这里,对IEnumerator做一些猜想。因为在写协程时,返回的参数同样是IEnumerator类型。而这里相当于每调用一次,就像Next实现的一样,把指针指向了下一个元素。再深究,感觉就是IEnumerator自身到底是一个什么类型的东西了,起什么作用。

最后附上两个链接,我这篇相当于对这两位笔者博文的结合。

https://blog.csdn.net/qq_39081464/article/details/81023878

https://blog.csdn.net/zfq18317916225/article/details/50717751

最后

以上就是害怕飞机为你收集整理的能用foreach遍历访问的对象需要实现____接口或声明____方法的类型的全部内容,希望文章能够帮你解决能用foreach遍历访问的对象需要实现____接口或声明____方法的类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部