当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行。
那么下面我们来看看,想要使用foreach需要具备什么条件。
声明GetEnumerator方法的类型。
下面我们来看看foreach原理,
参考原文 http://blog.csdn.net/guobin_lu/article/details/8812092
为什么有些类可以可以用foreach遍历,有些类却不可以了.经反编译过后得出:
</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Myforeach
{
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Program
{
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)
{
Person p </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Person();
p[</span><span style="color: #800080;">0</span>] = <span style="color: #800000;">"</span><span style="color: #800000;">宝马</span><span style="color: #800000;">"</span><span style="color: #000000;">;
p[</span><span style="color: #800080;">1</span>] = <span style="color: #800000;">"</span><span style="color: #800000;">奥迪</span><span style="color: #800000;">"</span><span style="color: #000000;">;
p[</span><span style="color: #800080;">2</span>] = <span style="color: #800000;">"</span><span style="color: #800000;">阿斯顿马丁</span><span style="color: #800000;">"</span><span style="color: #000000;">;
</span><span style="color: #008000;">//</span><span style="color: #008000;">for (int i = 0; i < p.Count; i++)
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> Console.WriteLine(p[i]);
</span><span style="color: #008000;">//</span><span style="color: #008000;">}
</span><span style="color: #008000;">//</span><span style="color: #008000;">任何类型,只要想使用foreach来循环遍历,就必须在当前类型中
</span><span style="color: #008000;">//</span><span style="color: #008000;">存在: public IEnumerator GetEnumerator()<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>,(一般情况我们会通过实现IEnumerable接口,来创建该<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>。) </span>
<span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">string</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> p)
{
Console.WriteLine(item);
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">IEnumerator etor = p.GetEnumerator();
</span><span style="color: #008000;">//</span><span style="color: #008000;">while (etor.MoveNext())
</span><span style="color: #008000;">//</span><span style="color: #008000;">{
</span><span style="color: #008000;">//</span><span style="color: #008000;"> string str = etor.Current.ToString();
</span><span style="color: #008000;">//</span><span style="color: #008000;"> Console.WriteLine(str);
</span><span style="color: #008000;">//</span><span style="color: #008000;">} </span>
<span style="color: #000000;"> Console.ReadKey();
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Person : IEnumerable
{
</span><span style="color: #0000ff;">private</span> List<<span style="color: #0000ff;">string</span>> listCar = <span style="color: #0000ff;">new</span> List<<span style="color: #0000ff;">string</span>><span style="color: #000000;">();
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> Count
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.listCar.Count;
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> <span style="color: #0000ff;">this</span>[<span style="color: #0000ff;">int</span><span style="color: #000000;"> index]
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> listCar[index];
}
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">if</span> (index >=<span style="color: #000000;"> listCar.Count)
{
listCar.Add(value);
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
listCar[index] </span>=<span style="color: #000000;"> value;
}
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> Name
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span><span style="color: #000000;"> Age
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span><span style="color: #000000;"> Email
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">set</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">#region</span> IEnumerable 成员
<span style="color: #008000;">//</span><span style="color: #008000;">这个<a href="https://www.jb51.cc/tag/fangfa/" target="_blank" class="keywords">方法</a>的作用不是用来遍历的,而是用来<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>一个对象
</span><span style="color: #008000;">//</span><span style="color: #008000;">这个对象才是用来遍历的。 </span>
<span style="color: #0000ff;">public</span><span style="color: #000000;"> IEnumerator GetEnumerator()
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> PersonEnumerator(listCar);
}
</span><span style="color: #0000ff;">#endregion</span> <span style="color: #000000;">
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">这个类型,的作用就是用来遍历Person中的List集合的。 </span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> PersonEnumerator : IEnumerator
{
</span><span style="color: #0000ff;">public</span> PersonEnumerator(List<<span style="color: #0000ff;">string</span>><span style="color: #000000;"> _cars)
{
cars </span>=<span style="color: #000000;"> _cars;
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">这个字段中存储的就是Person对象中的listCar集合 </span>
<span style="color: #0000ff;">private</span> List<<span style="color: #0000ff;">string</span>><span style="color: #000000;"> cars;
</span><span style="color: #008000;">//</span><span style="color: #008000;">假设一开始遍历的对象的索引是-1 </span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> index = -<span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">#region</span> IEnumerator 成员
<span style="color: #008000;">//</span><span style="color: #008000;">表示<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>当前正在遍历的那个对象 </span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">object</span><span style="color: #000000;"> Current
{
</span><span style="color: #0000ff;">get</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">if</span> (index < <span style="color: #800080;">0</span><span style="color: #000000;">)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> cars[index];
}
}
</span><span style="color: #008000;">//</span><span style="color: #008000;">让<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a>下标index累加 </span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> MoveNext()
{
index </span>= index + <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">if</span> (index >=<span style="color: #000000;"> cars.Count)
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">
{
</span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> Reset()
{
index </span>= -<span style="color: #800080;">1</span><span style="color: #000000;">;
}
</span><span style="color: #0000ff;">#endregion</span> <span style="color: #000000;">
}
} </span></pre>
如果大家想要详细了解 foreach语句。建议大家学习一下迭代器。
参考网址
http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html
原文链接:https://www.f2er.com/aspnet/238742.html