注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

能用foreach遍历访问的对象需要实现____接口或声明____方法的类型  

2011-02-25 17:11:31|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、答案

      能用foreach遍历访问的对象需要实现IEnumerable接口或声明GetEnumerator方法的类型

      注:不一定要实现IEnumerable接口,但一定要实现GetEnumrator方法。

二、实现

using System;
using System.Collections;
using System.Text;

namespace ConsoleApplication3
{

    public class Person
    {
        public Person(string fName, string lName)
        {
            this.firstName = fName;
            this.lastName = lName;
        }

        public string firstName;
        public string lastName;
    }

    public class People : IEnumerable
    {
        private Person[] _people;
        public People(Person[] pArray)
        {
            _people = new Person[pArray.Length];

            for (int i = 0; i < pArray.Length; i++)
            {
                _people[i] = pArray[i];
            }
        }

        public IEnumerator GetEnumerator()
        {
            return new PeopleEnum(_people);
        }
    }

    public class PeopleEnum : IEnumerator
    {
        public Person[] _people;

        // Enumerators are positioned before the first element
        // until the first MoveNext() call.
        int position = -1;

        public PeopleEnum(Person[] list)
        {
            _people = list;
        }

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

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

        public object Current
        {
            get
            {
                try
                {
                    return _people[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

 

    public class MyList<T> : IEnumerable
    {
        public int Count
        {
            get { return Items == null ? 0 : Items.Length; }
        }

        public T[] Items
        {
            get;
            set;
        }

        public T this[int index]
        {
            get { return Items[index]; }
        }

        //返回一个循环访问集合的枚举数。
        public IEnumerator GetEnumerator()
        {
            return new MyEnumerator<T>() { List = this };
        }
    }

    public class MyEnumerator<T> : IEnumerator
    {
        private int index = -1;
        public MyList<T> List
        {
            get;
            set;
        }

        //将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。
        public void Reset()
        {
            index = -1;
        }

        //将枚举数推进到集合的下一个元素。
        public bool MoveNext()
        {
            index++;
            return (index < List.Count);
        }

        //获取集合中的当前元素。
        public object Current
        {
            get { return List[index]; }
        }
    }

    class EnumerableTest
    {
        static void Main()
        {
                    Person[] peopleArray = new Person[3]
                {
                    new Person("John", "Smith"),
                    new Person("Jim", "Johnson"),
                    new Person("Sue", "Rabon"),
                };

                    People peopleList = new People(peopleArray);
                    foreach (Person p in peopleList)
                        Console.WriteLine(p.firstName + " " + p.lastName);

 

                    MyList<int> list = new MyList<int>() { Items = new int[] { 1, 2, 3, 4 } };
                    foreach (int item in list)
                    {
                        Console.WriteLine(item.ToString());
                    }


                    Console.ReadLine();

        }
    }


}

  评论这张
 
阅读(1253)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017