字典Dictionary循环Remove自减时注意不能用foreach,否则会导致循环的时候自己的数量在变化,导致报错,
未解决此问题,需要用for
测试,初始化字典时候,添加2个list,各8个item
编码实现 ConcurrentDictionary<int, List<int>> dic = new ConcurrentDictionary<int, List<int>>();//字典 int count = 0;//list里面的item数量,全局 int countdic = 0;//dic里面的键值对数量。全局 public Form1() { InitializeComponent(); List<int> ss = new List<int>(); ss.Add(1); ss.Add(2); ss.Add(3); ss.Add(4); ss.Add(5); ss.Add(6); ss.Add(7); ss.Add(8); dic.TryAdd(1, ss); List<int> ss1 = new List<int>(); ss1.Add(1); ss1.Add(2); ss1.Add(3); ss1.Add(4); ss1.Add(5); ss1.Add(6); ss1.Add(7); ss1.Add(8); dic.TryAdd(2, ss1); //List<int> ss2 = new List<int>(); //ss2.Add(1); //ss2.Add(2); //dic.TryAdd(3, ss2); }
点击按钮一个个移除或者取出所有的list的item,如果list数量为1时候,直接删除键值对,
每次移除,进行计数,统计次数
编码实现 private void button5_Click(object sender, EventArgs e) { for (int index = 0; index < dic.Count; index++) { var item = dic.ElementAt(index); for (int i = 0; i < item.Value.Count; i++) { if (item.Value.Count == 1) { List<int> listCmd = null; if (dic.TryRemove(item.Key, out listCmd)) { } } else { item.Value.Remove(item.Value[i]); i--; } count++; } index--; countdic++; } MessageBox.Show(countdic.ToString() + "次Remove字典,Remove字典List子数次数:" + count.ToString()); }
值得注意的是每次移除的时候需要进行内部的循环指针--,可完美实现foreach的问题