1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Collections; 6 7 namespace _06为什么有些类可以使用foreach循环遍历 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //ArrayList arrList1 = new ArrayList() { 20, 3, 49, 39, 48 }; 14 //foreach (var item in arrList1) 15 //{ 16 // Console.WriteLine(item); 17 //} 18 //Console.WriteLine("========================================="); 19 20 //string[] names = { "a", "b", "c", "d" }; 21 //foreach (string item in names) 22 //{ 23 // Console.WriteLine(item); 24 //} 25 26 //Console.WriteLine("===================================="); 27 //List<string> list = new List<string>() { "乔丹", "可比", "詹姆斯" }; 28 //foreach (string item in list) 29 //{ 30 // Console.WriteLine(item); 31 //} 32 33 //Console.WriteLine("===================================="); 34 Person p = new Person(); 35 p[0] = "奇瑞QQ"; 36 p[1] = "infiniti"; 37 p[2] = "阿斯顿马丁"; 38 //for (int i = 0; i < p.Count; i++) 39 //{ 40 // Console.WriteLine(p[i]); 41 //} 42 43 //任何类型,只要想使用foreach来循环遍历,就必须在当前类型中 44 //存在: public IEnumerator GetEnumerator()方法,(一般情况我们会通过实现IEnumerable接口,来创建该方法。) 45 foreach (string item in p) 46 { 47 Console.WriteLine(item); 48 } 49 50 //IEnumerator etor = p.GetEnumerator(); 51 //while (etor.MoveNext()) 52 //{ 53 // string str = etor.Current.ToString(); 54 // Console.WriteLine(str); 55 //} 56 Console.ReadKey(); 57 58 59 } 60 } 61 62 public class Person : IEnumerable 63 { 64 private List<string> listCar = new List<string>(); 65 66 public int Count 67 { 68 get 69 { 70 return this.listCar.Count; 71 } 72 73 } 74 75 public string this[int index] 76 { 77 get 78 { 79 return listCar[index]; 80 } 81 82 set 83 { 84 if (index >= listCar.Count) 85 { 86 listCar.Add(value); 87 } 88 else 89 { 90 listCar[index] = value; 91 } 92 } 93 } 94 public string Name 95 { 96 get; 97 set; 98 } 99 public int Age 100 { 101 get; 102 set; 103 } 104 public string Email 105 { 106 get; 107 set; 108 } 109 110 #region IEnumerable 成员 111 112 //这个方法的作用不是用来遍历的,而是用来获取一个对象 113 //这个对象才是用来遍历的。 114 public IEnumerator GetEnumerator() 115 { 116 return new PersonEnumerator(listCar); 117 } 118 119 #endregion 120 } 121 122 //这个类型,的作用就是用来遍历Person中的List集合的。 123 public class PersonEnumerator : IEnumerator 124 { 125 public PersonEnumerator(List<string> _cars) 126 { 127 cars = _cars; 128 } 129 130 //这个字段中存储的就是Person对象中的listCar集合 131 private List<string> cars; 132 133 134 //假设一开始遍历的对象的索引是-1 135 private int index = -1; 136 137 #region IEnumerator 成员 138 139 140 //表示获取当前正在遍历的那个对象 141 public object Current 142 { 143 get 144 { 145 if (index < 0) 146 { 147 return null; 148 } 149 return cars[index]; 150 } 151 } 152 //让自定义下标index累加 153 public bool MoveNext() 154 { 155 index = index + 1; 156 if (index >= cars.Count) 157 { 158 return false; 159 } 160 else 161 { 162 return true; 163 } 164 } 165 166 public void Reset() 167 { 168 index = -1; 169 } 170 171 #endregion 172 } 173 }