问题起源于本人的一个练手的扑克牌程序:洗完牌之后要发给场上的三人。 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 里面实际上就是调用了这个方法。 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方法那里会报错,需要提供两个参数,键和值。 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 语句编译之后也会产生类似于上面所写的代码。实际上这幅图可以比较清楚的说明一切。
务必看看这里其实前面的做法都是舍近求远.... 我一开始写的时候,觉得那样做还挺好的。甚至还自信满满的点了发送到首页[捂脸] 下面就给大家分享更正一下我学到的知识: 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(); }); 对于字典,可以使用 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(); }); 可能各位早会这样弄了,让各位进来实在是不好意思了。 |
|