2010-06-29 175 views
5

我有这个和所有似乎工作正常,但不知道为什么,如果它的有效。C# - 从while循环中的词典中删除项目

 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();

回答

10

以这种方式在while循环中改变集合类型没有任何问题。当您在foreach区块中变更收集时,您遇到麻烦的地方是。或者在基础集合发生变异后更一般地使用IEnumerator<T>

虽然在此示例中这将是一个简单得多,只是叫test.Clear() :)

1

这样的作品,很好的,因为你不遍历字典同时删除项目。每次检查test.Count时,就像是从头开始检查它。

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

test.Clear(); 
1

它的工作原理,因为伯爵将在每次你删除一个对象时更新。所以说计数是3,test.Remove会将count计为2,依此类推,直到计数为0,那么你将跳出循环

0

您正在做的是取出集合中的最后一个项目并将其删除,直到“词典”中没有剩余项目。

没有什么不寻常的,没有理由不应该工作(只要清空集合是你想要做的)。

0

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

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

这似乎可以工作,但它看起来非常昂贵。如果你用foreach循环遍历它,这会是一个问题(你不能在迭代时编辑集合)。

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

0

尽管你的更新,你可能仍然使用清晰......

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

你来。去年(呼叫)将是一个大辞典效率极其低下,并不能保证任何特定顺序(字典是一个无序的集合)

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()速度较慢并且不需要计数 - 您可以获取所有(唯一)键的列表。