涉及 C#的 foreach问题

前端之家收集整理的这篇文章主要介绍了涉及 C#的 foreach问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行。

那么下面我们来看看,想要使用foreach需要具备什么条件。

声明GetEnumerator方法的类型。

 下面我们来看看foreach原理,

参考原文  http://blog.csdn.net/guobin_lu/article/details/8812092

为什么有些类可以可以用foreach遍历,有些类却不可以了.经反编译过后得出:

 

 

</span><span style="color: #0000ff;"&gt;namespace</span><span style="color: #000000;"&gt; Myforeach { </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Program { </span><span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> Main(<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt;[] args) { Person p </span>= <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Person(); p[</span><span style="color: #800080;"&gt;0</span>] = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;宝马</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; p[</span><span style="color: #800080;"&gt;1</span>] = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;奥迪</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; p[</span><span style="color: #800080;"&gt;2</span>] = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;阿斯顿马丁</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;; </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;for (int i = 0; i < p.Count; i++) </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;{ </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Console.WriteLine(p[i]); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;} </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;任何类型,只要想使用foreach来循环遍历,就必须在当前类型中 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;存在: 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;"&gt;foreach</span> (<span style="color: #0000ff;"&gt;string</span> item <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; p) { Console.WriteLine(item); } </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;IEnumerator etor = p.GetEnumerator(); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;while (etor.MoveNext()) </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;{ </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; string str = etor.Current.ToString(); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; Console.WriteLine(str); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;} </span>

<span style="color: #000000;"> Console.ReadKey();

        }  
    }  

    </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Person : IEnumerable  
    {  
        </span><span style="color: #0000ff;"&gt;private</span> List<<span style="color: #0000ff;"&gt;string</span>> listCar = <span style="color: #0000ff;"&gt;new</span> List<<span style="color: #0000ff;"&gt;string</span>><span style="color: #000000;"&gt;();  

        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; Count  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;  
            {  
                </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;this</span><span style="color: #000000;"&gt;.listCar.Count;  
            }  

        }  

        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span> <span style="color: #0000ff;"&gt;this</span>[<span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; index]  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;  
            {  
                </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; listCar[index];  
            }  

            </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;  
            {  
                </span><span style="color: #0000ff;"&gt;if</span> (index >=<span style="color: #000000;"&gt; listCar.Count)  
                {  
                    listCar.Add(value);  
                }  
                </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;  
                {  
                    listCar[index] </span>=<span style="color: #000000;"&gt; value;  
                }  
            }  
        }  
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; Name  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;;  
            </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;;  
        }  
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;int</span><span style="color: #000000;"&gt; Age  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;;  
            </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;;  
        }  
        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; Email  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;;  
            </span><span style="color: #0000ff;"&gt;set</span><span style="color: #000000;"&gt;;  
        }  

        </span><span style="color: #0000ff;"&gt;#region</span> IEnumerable 成员  

        <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这个<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;"&gt;//</span><span style="color: #008000;"&gt;这个对象才是用来遍历的。  </span>
        <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; IEnumerator GetEnumerator()  
        {  
            </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; PersonEnumerator(listCar);  
        }  

        </span><span style="color: #0000ff;"&gt;#endregion</span>  <span style="color: #000000;"&gt;
    }  

    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这个类型,的作用就是用来遍历Person中的List集合的。  </span>
    <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; PersonEnumerator : IEnumerator  
    {  
        </span><span style="color: #0000ff;"&gt;public</span> PersonEnumerator(List<<span style="color: #0000ff;"&gt;string</span>><span style="color: #000000;"&gt; _cars)  
        {  
            cars </span>=<span style="color: #000000;"&gt; _cars;  
        }  

        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;这个字段中存储的就是Person对象中的listCar集合  </span>
        <span style="color: #0000ff;"&gt;private</span> List<<span style="color: #0000ff;"&gt;string</span>><span style="color: #000000;"&gt; cars;  


        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;假设一开始遍历的对象的索引是-1  </span>
        <span style="color: #0000ff;"&gt;private</span> <span style="color: #0000ff;"&gt;int</span> index = -<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;  

        </span><span style="color: #0000ff;"&gt;#region</span> IEnumerator 成员  


        <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;表示<a href="https://www.jb51.cc/tag/huoqu/" target="_blank" class="keywords">获取</a>当前正在遍历的那个对象  </span>
        <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;object</span><span style="color: #000000;"&gt; Current  
        {  
            </span><span style="color: #0000ff;"&gt;get</span><span style="color: #000000;"&gt;  
            {  
                </span><span style="color: #0000ff;"&gt;if</span> (index < <span style="color: #800080;"&gt;0</span><span style="color: #000000;"&gt;)  
                {  
                    </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;null</span><span style="color: #000000;"&gt;;  
                }  
                </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; cars[index];  
            }  
        }  
        </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;让<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank" class="keywords">自定义</a>下标index累加  </span>
        <span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;bool</span><span style="color: #000000;"&gt; MoveNext()  
        {  
            index </span>= index + <span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;  
            </span><span style="color: #0000ff;"&gt;if</span> (index >=<span style="color: #000000;"&gt; cars.Count)  
            {  
                </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;false</span><span style="color: #000000;"&gt;;  
            }  
            </span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt;  
            {  
                </span><span style="color: #0000ff;"&gt;return</span> <span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;;  
            }  
        }  

        </span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; Reset()  
        {  
            index </span>= -<span style="color: #800080;"&gt;1</span><span style="color: #000000;"&gt;;  
        }  

        </span><span style="color: #0000ff;"&gt;#endregion</span>  <span style="color: #000000;"&gt;
    }  
}  </span></pre>

 如果大家想要详细了解 foreach语句。建议大家学习一下迭代器。

参考网址

http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html

原文链接:https://www.f2er.com/aspnet/238742.html

猜你在找的asp.Net相关文章