最近在對的程式進行效能優化,在優化過程中用到了dictionary,在通過foreach將dictionary中的資料寫入資料庫時,遇到了這樣的錯誤:
collection was modified; enumeration operation may not execute.
**類似這樣的:
dictionary
<
int,
int>
_dictionary
=new
dictionary
<
int,
in>
();//
新增資料操作省略
foreach
(keyvaluepair
<
int,
int>
item
in_dictionary)
在執行foreach時,其他執行緒對_dictionary進行了add操作,改變了_dictionary中的資料,從而產生了上述的異常資訊。
那什麼會產生這樣的異常資訊呢?
foreach實際上執行的**是:
dictionary
<
int,
int>
.enumerator enumerator
=_dictionary.getenumerator();
try
} finally
通過reflector檢視dictionary.enumerator.movenext()源**,我們會發現開始處有這樣的**: if
(this
.version
!=this
.dictionary.version)
而異常就是在這裡發生的,因為add操作時改變了dictionary的version,通過檢視insert(tkey key, tvalue value, bool add)的源**會看出。
我覺得dictionary應該提供乙個方法,可以設定在movenext時是否進行版本檢查,因為有時在foreach操作時,可能並不關心dictionary中的資料是否被修改,我遇到的就是這樣的情況,現在由於這個問題而不能使用foreach,而只能採取其他方法遍歷dictionary中的資料。
我採用的方法是:
dictionary
<
int,
int>
_dictionary
=new
dictionary
<
int,
in>
();//
新增資料操作省略
int dataarray
=new
int[_dictionary.values.count];
_ dictionary.values.copyto(evcarray, 0)
for(
inti =0
; i
<
dataarray.length; i++)
在Dictionary使用foreach的注意
最近在對的程式進行效能優化,在優化過程中用到了dictionary,在通過foreach將dictionary中的資料寫入資料庫時,遇到了這樣的錯誤 collection was modified enumeration operation may not execute.類似這樣的 diction...
在Dictionary中使用列舉
自從.net framework 2.0引入泛型之後,對集合的使用就開創了新的局面。首先我們不用考慮型別是否安全,利用泛型以及對泛型引數的約束完全可以保障這一點 其次,集合元素不會因為頻繁的boxing和unboxing而影響集合遍歷與操作的效能。泛型帶來的這兩點好處毋庸置疑。在dictionary...
在Dictionary中使用列舉
自從.net framework 2.0引入泛型之後,對集合的使用就開創了新的局面。首先我們不用考慮型別是否安全,利用泛型以及對泛型引數的約束完全可以保障這一點 其次,集合元素不會因為頻繁的boxing和unboxing而影響集合遍歷與操作的效能。泛型帶來的這兩點好處毋庸置疑。在dictionary...