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

问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人。
只发给单个人的时候用 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 语句编译之后也会产生类似于上面所写的代码。实际上这幅图可以比较清楚的说明一切。

当然你也可以看看我写的这篇随笔,了解更多细节https://www.cnblogs.com/AD-milk/p/12459944.html

务必看看这里

其实前面的做法都是舍近求远....

我一开始写的时候,觉得那样做还挺好的。甚至还自信满满的点了发送到首页[捂脸]
然后....当然是马上就被撤了。我当然是不服的(声音减弱),于是就发邮件询问。
结果当然就是被管理员教育了,其实管理员挺耐心,教会了我很多。(隔着屏幕我也不知道对面想不想顺着网线打我)
如果你还想保留原来的集合的话,那么用上面的方法是可行的,如果不想的话,那么像下面那样使用linq 会更好。

下面就给大家分享更正一下我学到的知识:

var PreCard = new Queue<string>() ;            PreCard.Enqueue("03a");            PreCard.Enqueue("03b");            PreCard.Enqueue("03c");            PreCard.Enqueue("03d");            PreCard.Enqueue("04a");            PreCard.Enqueue("04b");                       var players = new List<List<string>>            {                new List<string>(),                new List<string>(),                new List<string>()            };            while (PreCard.Count > 0)            {                players.ForEach(p => p.Add(PreCard.Dequeue()));            }            players.ForEach(p =>            {                p.ForEach(c => Console.Write(c + " "));                Console.WriteLine();            });

对于字典,可以使用KeyValuePair

var PreCard = new Queue<KeyValuePair<string, int>>(                new Dictionary<string, int>                {                    {"a",1 },{"b",2 },{"c",3 },{"d",4 },{"e",5 },{"f",6 }                });            var players = new List<List<KeyValuePair<string, int>>>            {                 new List<KeyValuePair<string, int>>(),                 new List<KeyValuePair<string, int>>(),                 new List<KeyValuePair<string, int>>()            };            while (PreCard.Count > 0)            {                players.ForEach(p => p.Add(PreCard.Dequeue()));            }            players.ForEach(p =>            {                p.ForEach(c => Console.Write(c + " "));                Console.WriteLine();            });

可能各位早会这样弄了,让各位进来实在是不好意思了。

(0)

相关推荐

  • foreach原理分析

    我们知道通常foreach可以实现对类型的遍历,但是foreach并不是针对所有类型都可以实现遍历的功能,那么我们可以思考这样的一个问题:foreach对类型实施遍历的依据条件是什么?它是通过什么方式 ...

  • 一文读懂Python可迭代对象、迭代器和生成器

    IT头条 每日推送最新.最热点的IT界新闻 马化腾回应"腾讯没有梦想"截图系网友PS:天天P图回应<我的前世青年照>涉嫌收集个人隐私:马云称阿里不愿招北大清华毕业生-- ...

  • 【Python 第75课】可迭代对象和迭代器

    for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的? 如果你以前接触过 C++,应该会知道类似 for (int i = 0; i < 100; ...

  • Python中可迭代对象怎么获取迭代器?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Excel 中不同对象间的层次关系

    听过VBA代码吗?羡慕能用代码高效办公的人吧!VBA代码远没有大家想象的那么难,跟着小编学一起学吧! 在VBA中,Excel的工作簿.工作表.单元格是对象,图表.透视表.图片也是对象,甚至单元格的边框 ...

  • 4种JavaScript中不同迭代对象的方法

    WEB前端开发社区 2021-11-02 在今天这篇文章里,我将介绍了一些迭代对象并获取键值对的方法.这些技巧可以被视为小石头,最终将帮助您渡过 JavaScript 面试的一些小河流. 我知道每个独 ...

  • [js] 第78天 举例说明数组和对象的迭代方法分别有哪些?

    今日试题: 举例说明数组和对象的迭代方法分别有哪些? 此开源项目四大宗旨:勤思考,多动手,善总结,能坚持 <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前 ...

  • 杨天真现身周扬青直播间送“对象”,祝其早日脱单,周扬青满脸羞涩

    5月27日,曾经一度非常抗拒直播的周扬青,终于还是屈服于大趋势,迎来自己的直播首秀,而且还邀请来了杨天真到现场助力. 不过杨天真在直播间待的时间并不长,两人先是互相送上礼物.周扬青送的是自创品牌的服装 ...

  • 世界语---各民族间沟通的便捷通道

    世界语以语法严谨.语音优美.逻辑性强.表现力丰富.简单易学而据称. 人的一生是短暂的,在国内用好本民族语言,用最短的一段时间学会世界语,用于国际间交流,是人类的最佳的选择.这样,既保卫了民族文化和语言 ...

  • 《易经》《六十四卦便捷记忆口诀》全文翻译

    《易经》《六十四卦便捷记忆口诀》全文翻译