集合已修改;可能無法執行枚舉操作。


問題描述:在用foreach遍歷hashtable的時候,彈出“集合已修改;可能無法執行枚舉操作。”

問題代碼:       

 private void Check(int TimeOut)        //這是一個存活檢查線程,為了把連接失效的主機剔除
        {
            DateTime t = DateTime.Now;//取出當前的時間
           //Hashtable
            foreach (DictionaryEntry item in _transmit_tb)//彈出“集合已修改;可能無法執行枚舉操作。”
            {
                
                if ((t - (DateTime)Time[item.Key]).Seconds > TimeOut)
                {
                    LogOut(item.Key);                                      //此函數的作用是剔除失效的主機


                }
            }
        }



解決方法:利用for進行遍歷。

ArrayList   akeys=new   ArrayList(_transmit_tb.Keys);   
for(int   p=akeys.Count-1;p> -1;p--) 

_transmit_tb.Remove(akeys[p]); 
}


原因:

1、hashtable存放你放入的值的時候   不是按照你存放順序放的 
所以當你用foreach遍歷的時候   就不能保證遍歷出來的順序和你原來存放進去的順序是一致的

2、msdn的解釋:foreach 語句是對枚舉數的包裝,它只允許從集合中讀取,不允許寫入集合。

也就是,不能在foreach里遍歷的時侯把它的元素進行刪除或增加的操作的


部分內容參考:http://topic.csdn.net/t/20050412/21/3931090.html

另外附上一篇:集合遍歷時刪除和增加元素

http://blog.csdn.net/educast/article/details/5875955


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM