c# foreach学习

c#的foreach需要类去实现 IEnumerable接口 还有个泛型的IEnumerable<T> 接口

 

我们从List的源码里可以看到 

 就是转了一层 所以我们直接从原始的IEnumerable接口实现就好

 public class ATest : IEnumerable
 {
     public int Num { get; set; }
     private ATest[] per;
     public ATest(int num)
     {
         Num = num;
     }

     public ATest(ATest[] arr)
     {
         per= arr;
     }
     public IEnumerator GetEnumerator()
     {
         Console.WriteLine("new ATestEnumerator");
         return new ATestEnumerator(per);
     }
 }

代码如上面所示,最主要的是这个GetEnumerator()方法,我们可以看到它需要我们返回IEnumerator类型的类

 注意2个接口的名称不要搞混了

 

    public class ATestEnumerator : IEnumerator
    {
        public object Current
        {
            get
            {
                    return _ATests[postition];
            }
        }
        int postition = -1;
        public ATest[] _ATests;

        public ATestEnumerator(ATest[] aTests)
        {
            _ATests = aTests;
        }

        public bool MoveNext()
        {
            return ++postition < _ATests.Length;
        }

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

代码如上面所示

foreach的执行逻辑是:

  1. 先执行GetEnumerator()获取IEnumerator
  2. 然后执行MoveNext()判断是否还有下一个数据
  3. 最后拿到Current的对象
posted @ 2024-05-05 21:56  大大只植物  阅读(26)  评论(0)    收藏  举报