簡體   English   中英

C# - 在 while 循環中從字典中刪除項目

[英]C# - Removing Items from Dictionary in while loop

我有這個,一切似乎都很好,但不確定為什么以及它是否有效。

        Dictionary<string, List<string>> test = new Dictionary<string, List<string>>();

        while (test.Count > 0)
        {
            var obj = test.Last();
            MyMethod(obj);
            test.Remove(obj.Key);
        }

更新:感謝您的回答,我已經更新了我的代碼來解釋為什么我不做 Dictionary.Clear();

以這種方式在while循環中改變集合類型沒有任何問題。 你遇到麻煩的地方是你在foreach區塊中改變一個集合。 或者更IEnumerator<T>是在底層集合發生變異后使用IEnumerator<T>

雖然在這個示例中,調用test.Clear() :)會簡單得多

我不明白為什么你試圖以相反的順序處理所有Dictonary條目 - 但你的代碼沒問題。

獲取所有密鑰列表並按鍵處理條目而不是一次又一次地計數可能會快一點......

例如:

var keys = test.Keys.OrderByDescending(o => o).ToList();

foreach (var key in keys)
{
    var obj = test[key];
    MyMethod(obj);
    test.Remove(key);
}

當他們通過鍵值訪問時,Dictonarys很快。 Last()速度較慢,無需計數 - 您可以獲得所有(唯一)鍵的列表。

這很好,因為你在刪除項目時沒有迭代字典。 每次檢查test.Count時,就像是從頭開始檢查它。

話雖這么說,上面的代碼可以寫得更簡單,更有效:

test.Clear();

它的工作原理是因為每次刪除對象時都會更新Count。 所以說計數是3,test.Remove會將計數記錄為2,依此類推,直到計數為0,那么你將打破循環

是的,這應該是有效的,但為什么不調用Dictionary.Clear()

您正在做的就是獲取集合中的最后一項並將其刪除,直到字典中沒有剩余項目為止。

沒有什么不尋常的,也沒有理由它不應該工作(只要清空集合就是你想要做的)。

所以,你只是想清除字典,對嗎? 你能不能做到以下幾點?

Dictionary<string, List<string>> test = new Dictionary<string, List<string>>();
        test.Clear(); 

這似乎可行,但看起來非常昂貴。 如果您使用foreach循環迭代它(在迭代時無法編輯集合),這將是一個問題。

Dictionary.Clear()應該做的伎倆(但你可能已經知道了)。

盡管你的更新,你仍然可以使用明確...

foreach(var item in test) {
  MyMethod(item);
}
test.Clear()

您對.Last()的調用在大型字典上效率極低,並且不保證處理的任何特定順序(字典是無序集合)

我使用此代碼有條件地刪除項目。

var dict = new Dictionary<String, float>
var keys = new String[dict.Count];
dict.Keys.CopyTo(keys, 0);

foreach (var key in keys) {
var v = dict[key];
if (condition) {
    dict.Remove(key);
}
          

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM