欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-17 16:01:45
[TOC] 都是迭代,为啥我一定要用foreach ​问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人。 ​只发给单个人的时候用 foreach 循环一下就好了,但三个人就有点麻烦了。 ​ 牌组用list保存你可能会想到这样写: ​或者这样写 ​但如果还想使用类似迭代器的方法 ......

目录

都是迭代,为啥我一定要用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# 便捷实现可迭代对象间的赋值

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