.NET 匿名方法的BUG,请专家解答
2015-02-05 13:24 钟铧若岩 阅读(3990) 评论(75) 编辑 收藏 举报匿名方法是.NET 3.5之后的一个好东东,很多人使用,但是我在最近的工作当中发现了一个问题. 请专家解答
1 //list里存放10个数字 2 List<int> list = new List<int>(10); 3 for (int i = 0; i < 10; i++) 4 { 5 list.Add(i); 6 } 7 8 //10个数字,分成10组,其实每组就一个元素,每组的元素是不相同的 9 Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>(); 10 for (int i = 0; i < 10; i++) 11 { 12 int k = i % 10; 13 if (dict.ContainsKey(k)) 14 { 15 dict[k].Add(i); 16 } 17 else 18 { 19 dict[k] = new List<int>(); 20 dict[k].Add(i); 21 } 22 }
接下来,我们先采用非匿名方法,实现打印每个组里的元素,代码如下
1 using (Dictionary<int, List<int>>.Enumerator enumerator = dict.GetEnumerator()) 2 { 3 KeyValuePair<int, List<int>> keyValue; 4 while (enumerator.MoveNext()) 5 { 6 keyValue = enumerator.Current; 7 8 System.Threading.Thread thread = new System.Threading.Thread(Display); 9 thread.Start(keyValue.Value); 10 } 11 } 12 13 public static void Display(object o) 14 { 15 List<int> list = o as List<int>; 16 foreach (var item in list) 17 { 18 Console.WriteLine(item.ToString()); 19 } 20 }
输出的结果是:
0
1
2
3
4
5
6
7
8
9
没有问题!!! 一切OK
好,我们换一种方式为实现输出各组的元素,采用匿名委托的方式.
1 using (Dictionary<int, List<int>>.Enumerator enumerator = dict.GetEnumerator()) 2 { 3 KeyValuePair<int, List<int>> keyValue; 4 while (enumerator.MoveNext()) 5 { 6 keyValue = enumerator.Current; 7 System.Threading.Thread thread = new System.Threading.Thread(delegate() 8 { 9 foreach (var item in keyValue.Value) 10 { 11 Console.WriteLine(item.ToString()); 12 } 13 } 14 ); 15 thread.Start(); 16 } 17 }
采用上面的代码,输出的结果不定,而且会出现重复的数据,结果可能如下
3
3
3
4
4
4
5
5
7
9
请专家解答一下,我一直没有找到原因!
这个号是09年注册的,可是博文只写了几个,感谢大家的热情回复!
此题可以结了。请大家看回复之后,如果有补充的地方再回复!