加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

涉及 C#的 foreach问题

发布时间:2020-12-15 21:11:15 所属栏目:asp.Net 来源:网络整理
导读:当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行。 那么下面我们来看看,想要使用foreach需要具备什么条件。 声明GetEnumerator方法的类型。 ?下面我们来看看foreach原理, 参考原文? ht

当时是用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()方法,(一般情况我们会通过实现IEnumerable接口,来创建该方法。) </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;这个方法的作用不是用来遍历的,而是用来获取一个对象  
        </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;表示获取当前正在遍历的那个对象  </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;让自定义下标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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读