在Dictionary使用foreach的注意

2022-01-15 05:59:49 字數 1502 閱讀 3094

最近在對的程式進行效能優化,在優化過程中用到了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...