foreash Hashtable改变值问题
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不大熟...
[解决办法]
for (int i=0;ht.Items.Count;i++)
{
System.Collections.DictionaryEntry item =ht.Items[i];
}
[解决办法]
foreach (System.Collections.DictionaryEntry item in ht)
中不能更改集合的值,
其实这个原因可以想得到的:因为你又在遍历集合,又在改变集合,你叫运行库如何识别啊。
举个例子:公司要盘点了,一般都是要放假盘点的,为啥呢?放假后库存都是静止状态的,才能盘点撒。
如果你在盘点时,有改懂库存,你咋个盘点呢?
[解决办法]
每个实现的迭代器,返回类型必须为 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(); } }
[解决办法]