如何尽快删除SortedDictionary的每个第二个元素?

时间:2011-07-07 01:07:57

标签: .net generics c#-4.0 dictionary sorteddictionary

我要尽快从SortedDictionary中删除每一个元素。字典(SortedDictionary<string, List<string>>)最多可包含20'000个元素。所以我提出了这个解决方案:

try
{
    int loop = 0;
    while (true)
    {
        Routes.Remove(Routes.ElementAt(loop).Key);
        loop++;
    }                
}
catch
{
}

有比这更简单/更好的解决方案吗? 捕获的异常会对性能产生影响吗?

编辑:这似乎是一个更好的解决方案(请参阅下面的评论):

SortedDictionary<string, List<string>> resizedRoutes = new SortedDictionary<string, List<string>>();
bool b = true;
foreach(KeyValuePair<string, List<string>> route in Routes)
{                                        
    if(b)
    {
        resizedRoutes.Add(route.Key, route.Value);
        b = false;
    }
    else
    {
        b = true;
    }
}
Routes = resizedRoutes;

如果您有更好的解决方案,请编辑/评论。感谢。

2 个答案:

答案 0 :(得分:6)

我对此表示怀疑,因为您需要:

  1. 删除项目,导致树重新平衡

  2. 将项目添加到新树,导致重新平衡新树

  3. 你无法真正避免它,但如果你不经常修改数据,那么迭代它们并将它们放在SortedList中可能更有效率。 。

    是:

    遍历这些项目,然后将其他所有项目添加到新树中,而不是修改当前树。这样你就可以避免每次调用ElementAt的成本,在理想的实现中是 对数,而使用LINQ的线性(这是<强烈的>可怕的,因为LINQ不知道你的树的实现。)

    至于例外:是的,它会受到性能影响。但是我不知道这与你正在做的事情有多大关系,所以它可能有意义也可能不重要 但不管怎样,你不应该忽视异常。 :)

    当你在它时:

    可能想看一下函数式编程。 :)

答案 1 :(得分:0)

这是一个足够好的解决方案。如果捕获到异常,则它将停止从字典中删除元素。也许重新安排它,就像这样:

int loop = 0;
lock(Routes)
{
    while (true)
    {
        try
        {
            Routes.Remove(Routes.ElementAt(loop).Key);
            loop++;
        }
        catch { break; }
    }
}

这将确保在删除元素时无法修改字典。