【问题标题】:How to remove every second element of a SortedDictionary as fast as possible?如何尽快删除 SortedDictionary 的第二个元素?
【发布时间】:2011-09-30 02:13:11
【问题描述】:

我必须尽快从 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;

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

【问题讨论】:

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


    【解决方案1】:

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

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

    2. 将项目添加到新树中,使新树重新平衡

    您无法真正避免它,但如果您不经常修改数据,那么仅遍历它们并将它们放入SortedList 可能会更有效。

    是的:

    遍历项目,然后将每个其他项目添加到新树中,而不是修改当前树。这样您就可以避免每次调用ElementAt 的成本,这在理想实现中至少是对数,而与 LINQ 的线性(即 太可怕了,因为 LINQ 不知道你的树的实现)。

    至于例外:是的,它会影响性能。但我不知道这与你正在做的事情有多大关系,所以它可能很重要,也可能不重要。
    但无论哪种方式,您都不应该忽略例外情况。 :)

    当你在它的时候:

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

    【讨论】:

    • 我正要在你更新之前发布这个答案。建造一棵新树比每次移除时重新平衡一棵老树要便宜得多。
    • @drharris:是的,我完全没有注意到ElementAt 是线性的,所以我完全忽略了它并认为它很好。
    • @Mehrdad 非常感谢您的回答 :-) 我想我会建一棵新树。我的假设是否正确,即此解决方案将使用比我的建议更多(50%)的内存?
    • @Mike:是的,暂时(或多或少)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 还有 Gulp!,catch 吃掉了另一个异常! :(
    • 嗯,有意思,你为什么把 try/catch 放到 while 循环中?
    • 所以当它试图移除不存在的元素时(在最后),它会跳出循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多