C# - 在while循环中从Dictionary中删除项目

Jon*_*Jon 5 .net c# .net-3.5 c#-3.0

我有这个,所有似乎工作正常,但不知道为什么,如果它有效.

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

        while (test.Count > 0)
        {
            var obj = test.Last();
            MyMethod(obj);
            test.Remove(obj.Key);
        }
Run Code Online (Sandbox Code Playgroud)

更新:感谢您的回答,我已经更新了我的代码来解释为什么我不做Dictionary.Clear();

Jar*_*Par 10

以这种方式在while循环中改变集合类型没有任何问题.遇到麻烦的地方是你在一个foreach区块中改变一个集合.或者更常见的是IEnumerator<T>在底层集合发生变异之后使用a .

虽然在这个示例中只是调用test.Clear():) 会简单得多:)


And*_*ehm 8

我不明白为什么你试图以相反的顺序处理所有Dictonary条目 - 但你的代码是正常的.

获取所有密钥列表并按键处理条目而不是一次又一次地计数可能会快一点......

例如:

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

foreach (var key in keys)
{
    var obj = test[key];
    MyMethod(obj);
    test.Remove(key);
}
Run Code Online (Sandbox Code Playgroud)

当他们通过键值访问时,Dictonarys很快.Last()速度较慢,无需计数 - 您可以获得所有(唯一)键的列表.