码迷,mamicode.com
首页 > Windows程序 > 详细

C#迭代法

时间:2020-04-06 15:17:28      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:rem   list   也会   有一个   对象   循环语句   目录   key   关于   

C# 便捷实现可迭代对象间的赋值

目录

都是迭代,为啥我一定要用foreach

如果换成是字典呢?

关于 foreach

都是迭代,为啥我一定要用foreach

? 问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人。

? 只发给单个人的时候用 foreach 循环一下就好了,但三个人就有点麻烦了。

? 牌组用list 保存你可能会想到这样写:

 

            for (int i = 0; i < PreCard.Count; i++)

            {

                a.Add(PreCard[i++]);

                b.Add(PreCard[i++]);

                c.Add(PreCard[i]);

            }

? 或者这样写

 

            int i = 0;

            do

            {

                a.Insert(i, PreCard[0]);

                b.Insert(i, PreCard[1]);

                c.Insert(i, PreCard[2]);

                PreCard.RemoveRange(0, 3);

                i++;

            } while (i < PreCard.Count);

? 但如果还想使用类似迭代器的方法,那么可以使用 GetEnumerator(),因为我们知道 foreach 里面实际上就是调用了这个方法。

? 所以我们还可以直接调用 GetEnumerator 和 MoveNext 来进行迭代:

 

            IEnumerator ie = PreCard.GetEnumerator();

            while(ie.MoveNext())

            {

                a.Add(ie.Current.ToString());

                ie.MoveNext();

                b.Add(ie.Current.ToString());

                ie.MoveNext(); 

                c.Add(ie.Current.ToString());

            }

如果换成是字典呢?

? 如果是直接把上面的代码搬过来,会发现add方法那里会报错,需要提供两个参数,键和值。

? 难道必须要对得到的 IEnumerator 再用一次 GetEnumerator?

? 实际上大可不必,因为针对这种键值对,我们有一个玩意叫做 IDictionaryEnumerator。看名字就知道它就是为此而生的。

 

            IDictionaryEnumerator ie = dict.GetEnumerator();

            while(ie.MoveNext())

            {

                a.Add(ie.Key.ToString(),Convert.ToInt32(ie.Value));

                ie.MoveNext();

                b.Add(ie.Key.ToString(),Convert.ToInt32(ie.Value));

                ie.MoveNext();

                c.Add(ie.Key.ToString(),Convert.ToInt32(ie.Value));

            }

? 至此我们通过写手动挡的 foreach ,成功的实现了可迭代对象间的赋值。

 

关于 foreach

? 在C#中 foreach 语句,能够进行比for循环语句更直接和简单的对集合的迭代,编译器会将 foreach 编译来调用 GetEnumerator 和 MoveNext方法以及Current属性。

 

? 实际上 foreach 语句编译之后也会产生类似于上面所写

C#迭代法

标签:rem   list   也会   有一个   对象   循环语句   目录   key   关于   

原文地址:https://www.cnblogs.com/ihdci/p/12642167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!