要实现foreach遍历要继承什么接口

 我来答
匿名用户
推荐于2018-04-09
展开全部
在使用FOREACH对集合进行遍历的时候,要求被遍历的对象必须实现了IENUMABLE接口,而该接口的唯一成员方法GETENUMATOR返回实现了IENUMATOR接口的实例对象。

检测IENUMATOR,发现有3个成员,分别是:CURRENT、MOVENEXT、RESET,CURRENT返回当前的成员对象;MOVENEXT把指针向下移动一个位置,如果存在实例成员则返回true,否则返回false,是FOREACH判断循环结束的条件;RESET则重置循环指针。

通过以上分析,想当然的在定义实现了IENUMABLE接口的类时一起实现IENUMATOR接口,也没有发现问题。直到一天需要对自定义的集合连续进行两次FOREACH的时候,发现第一次OK,第二次出现了问题,郁闷呀。调试很久都解决不了问题。

多方面测试、跟踪后,发现FOREACH并不会调用RESET这个重置方法,从而当第二个FOREACH执行的时候,成员指针已经指到最后面,MOVENEXT永远返回false,而之前想当然的认为在调用FOREACH的时候,要么开始执行RESET,要么最后执行RESET,结果不然。

反编译MS对集合类定义的代码,发现,类在实现IENUMABLE的方法GETENUMATOR的时候,是全新的创建了一个实现了IENUMATOR接口内部类实例,所以不会出现连续FOREACH时数据不正常的情况。

MS为什么采用这样的方案实现IENUMATOR呢?想想也是自己蠢呀,如果一个实例集合在多线程中被同时FOREACH,那指针还不混乱?这个实现方案是MS保证集合类实例在多线程环境安全的至要保证。

用foreach循环一次性遍历a数组

int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组a
foreach(int i in a)
{
Console .WriteLine (i);
}

这两种代码执行的结果是一样的都是 每行一个元素,共8行,元素分别是1 2 3 4 5 6 7 8
百度网友cfe4d0f
2013-04-02 · TA获得超过1502个赞
知道小有建树答主
回答量:937
采纳率:100%
帮助的人:850万
展开全部
C#的foreach需要类型继承IEnumerable或IEnumerable<T>
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式