自我理解foreach工作原理

时间:2024-12-18 10:08:13

    很多时候我们在使用for循环遍历一个数组的时候,我们都知道可以通过下标的索引找到当前数组中所对应的数据。这只对于简单的数组或集合,如果我们存储的数据不止只有数据项,还有一个标识项,就如同Hashtable 和 Dictionary<key,value> 包含有key value键值对的时候,如果再去使用for循环就没有实际意义了。这种情况下就用到了foreach。有些博客上也有讲解到foreach实现的原理,foreach是被设计用来和可枚举类型一起使用。只要它的遍历对象是可枚举类型。如果一种类型的数据需要使用foreach来遍历数据,那么该类型就必须实现GetEnumerator()方法,具体实现GetEnumerator()可以通过实现IEnumerable接口来创建此方法。当使用foreach语句时,会通过GetEnumerator()方法返回一个枚举迭代器。通过该迭代器可以依次返回集合中项的类对象。从枚举数中请求每一项并且把它作为迭代变量,代码可以读但不可以改。

自我理解foreach工作原理

 IEnuerator接口中通过MoveNext()方法和Current()方法来遍历数据。并返回迭代的数据。

2.使用IEnuerator接口中通过MoveNext()方法和Current()方法写自己的foreach()遍历数据。

   1.首先建一个MyList类,想通过foreach()来遍历列表中的数据:让MyList类实现IEnumerable接口,创建GetEnumerator()方法,调用GetEnumerator()方法返回一个IEnumerator类型的迭代器,用于迭代列表中的数据,并且返回。

class MyList:IEnumerable
      {
            private List<string> _list = new List<string>();

public string this[int index]
             {
                get
                 {
                     return _list[index];
                 }
                set
                 {
                    _list[index] = value;
                 }
             }

public void Add(string value)
           {
                _list.Add(value);
           }

public int Count()
          {
               return _list.Count;
          }

public IEnumerator GetEnumerator()
          {
              return new MyListEnumerator(_list);
          }
     }

2.创建MyListEnumerator类实现IEnumerator 接口,用于遍历数据,并且返回IEnumerator 类型的数据。

class MyListEnumerator : IEnumerator
         {
              private List<string> _list;

public MyListEnumerator(List<string> list)   //构造函数,初始化对象时传递一个list<string>集合
               {
                    _list = list;
               }

private int index = -1;//标识当前数据遍历到第几个位置

public object Current//获得当前对象
             {
                  get
                  {
                      return _list[index];
                  }
             }

public bool MoveNext()//如果还有下一个对象,则移动到下一个对象
            {
                  if (index < _list.Count - 1)
                    {
                         index++;
                         return true;
                    }
                 else
                   {
                        return false;
                   }
            }

public void Reset()//重置指针位置,指向第一个位置
           {
                 index = -1;
           }
     }

通过迭代器把遍历的数据以对象的形式返回给调用方法。

 

MyList myList = new MyList();
          myList.Add("北京");
          myList.Add("上海");
          myList.Add("河南");
          //foreach (string item in myList)
          //{
          // Console.WriteLine(item);
          //}

IEnumerator ator = myList.GetEnumerator();
          while (ator.MoveNext())
          {
             string m = (string)ator.Current;
             Console.WriteLine(m);
          }
          Console.ReadKey();