Hashtable ht = (Hashtable)Session["c"];
Hashtable ht2 = ht;foreach (System.Collections.DictionaryEntry item in ht)
{
  M_OfProduct m_OfProduct  = item.Value as M_OfProduct; //M_OfProduct 是个Model层
  
  m_OfProduct.ProductCount=3;  //改变数量-----  ht2["ca"] = m_OfProduct;     //存入Hashtable()
}Session["c"] = ht2;
----------------------------
执行后提示错误:集合已修改;可能无法执行枚举操作。
这里用两个Hashtable就是因为Hashtable的值改变后还在遍历才会报这种错误,。
 后来经测试还是一样的错误,它们应该是引用类型,。
----------
 在网上查询说是只能用for才行,。
知道的说下用foreach 的话,还有什么方法,
 如果用for来循环,麻烦贴下代码。,对Hashtable不大熟...

解决方案 »

  1.   

    for (int i=0;ht.Items.Count;i++)
    {
    System.Collections.DictionaryEntry item =ht.Items[i];
    }
      

  2.   

    好吧,我之前尝试过想用ht.Items.Count;
     结果,,发现没有Items这个对象。...
      

  3.   

    foreach (System.Collections.DictionaryEntry item in ht)
    中不能更改集合的值,
    其实这个原因可以想得到的:因为你又在遍历集合,又在改变集合,你叫运行库如何识别啊。
    举个例子:公司要盘点了,一般都是要放假盘点的,为啥呢?放假后库存都是静止状态的,才能盘点撒。
    如果你在盘点时,有改懂库存,你咋个盘点呢?
      

  4.   

    每个实现的迭代器,返回类型必须为 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。foreach中的迭代变量是即为IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>类型。从上面的接口可以看出,object Current是只读的,因此,foreach迭代变量只能是只读的。namespace System.Collections  
    {  
        // 摘要:  
        //     支持对非泛型集合的简单迭代。  
        [ComVisible(true)]  
        [Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]  
        public interface IEnumerator  
        {  
            // 摘要:  
            //     获取集合中的当前元素。  
           //  
            // 返回结果:  
            //     集合中的当前元素。  
            //  
            // 异常:   
           //   System.InvalidOperationException:  
            //     枚举数定位在该集合的第一个元素之前或最后一个元素之后。  
            object Current { get; }  
            bool MoveNext();  
            void Reset();  
        }  
    }  
      
    namespace System.Collections  
    {  
        // 摘要:  
        //     公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。  
        [ComVisible(true)]  
        [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]  
        public interface IEnumerable  
        {  
            // 摘要:  
            //     返回一个循环访问集合的枚举数。  
            //  
            // 返回结果:  
            //     可用于循环访问集合的 System.Collections.IEnumerator 对象。  
           [DispId(-4)]  
            IEnumerator GetEnumerator();  
        }  
    }  
      

  5.   

    foreach (System.Collections.DictionaryEntry item in ht.ToList())
    {
      M_OfProduct m_OfProduct = item.Value as M_OfProduct; //M_OfProduct 是个Model层
       
      m_OfProduct.ProductCount=3; //改变数量-----  ht2["ca"] = m_OfProduct; //存入Hashtable()
    }
      

  6.   

    出现错误就是这个原因,可以像曹版主那样直接转换为List来操作
      

  7.   

    不是转换为List,而是不要直接使用这个HashTable的迭代器,而是复制到一个List中,使用List的迭代器。实际上,ToArray,ToDictionary都是可以的。