首頁 >後端開發 >C++ >通過C#中的字典迭代時,如何解決'收集已修改”錯誤?

通過C#中的字典迭代時,如何解決'收集已修改”錯誤?

Susan Sarandon
Susan Sarandon原創
2025-02-02 03:41:091001瀏覽

How to Resolve the

輕鬆解決“集合已修改”難題:循環中避免列表修改

在編程過程中,遇到令人沮喪的“集合已修改;枚舉操作可能無法執行”錯誤時,程序員常常會感到困惑,尤其是在調試器下問題仍然難以察覺時。但是,不用擔心,解決方法在於理解在出錯循環中潛在的列表更改。

此錯誤發生在循環迭代集合時修改集合中的元素時。在提供的WCF服務器代碼片段中,“訂閱者”字典在“NotifySubscribers”方法的“foreach”循環中被修改。具體來說,當“SignalData”方法間接修改字典時,就會導致此錯誤。

為了解決這個問題,我們可以在循環之前使用“ToList()”方法將字典的值轉換為新的列表,從而避免“集合已修改”的陷阱。這將創建一個獨立於原始字典的單獨列表,確保在循環期間對其進行的更改不會影響迭代過程。

以下是調整代碼的方法:

<code class="language-c#">private static readonly IDictionary<Guid, Subscriber> subscribers = new Dictionary<Guid, Subscriber>();

...

public void NotifySubscribers(DataRecord sr)
{
    foreach (Subscriber s in subscribers.Values.ToList()) // 将值复制到单独的列表中
    {
        try
        {
            s.Callback.SignalData(sr);
        }
        catch 
        ...
    }
}</code>

通過使用此技術,循環不再操作原始字典,而是操作獨立副本。這消除了並發修改的可能性,並防止了令人討厭的“集合已修改”錯誤。

以上是通過C#中的字典迭代時,如何解決'收集已修改”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn