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

时间:2010-06-29 18:25:19

标签: c# .net .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);
        }

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

9 个答案:

答案 0 :(得分:10)

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

虽然在这个示例中,只需调用test.Clear():)

就简单多了

答案 1 :(得分:8)

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

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

E.G:

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

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

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

答案 2 :(得分:1)

这很好用,因为在删除项目时你没有迭代字典。每次检查test.Count时,就像是从头开始检查它。

话虽这么说,上面的代码可以写得更简单,更有效:

test.Clear();

答案 3 :(得分:1)

它的工作原理是因为每次删除对象时都会更新Count。所以说计数是3,test.Remove会将计数记录为2,依此类推,直到计数为0,那么你就会突破循环

答案 4 :(得分:0)

是的,这应该有效,但为什么不调用Dictionary.Clear()

答案 5 :(得分:0)

您所做的只是取出集合中的最后一项并将其删除,直到字典中没有剩余项目为止。

没有什么不同寻常的事情,也没有理由它不起作用(只要清空集合就是你想要做的事情)。

答案 6 :(得分:0)

所以,你只是想清除字典,对吗?你能不能做到以下几点?

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

答案 7 :(得分:0)

这似乎会起作用,但它看起来非常昂贵。如果您使用foreach循环迭代它(在迭代时无法编辑集合),这将是一个问题。

Dictionary.Clear()应该做的伎俩(但你可能已经知道了)。

答案 8 :(得分:0)

尽管您有更新,但您仍然可以使用明确的...

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

您对.Last()的调用在大型字典上效率极低,并且不保证处理的任何特定顺序(字典是无序集合)