首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyedCollection删除()问题

KeyedCollection删除()问题
EN

Stack Overflow用户
提问于 2022-01-09 17:19:03
回答 1查看 53关注 0票数 0

我试图在两个KeyedCollection之间移动项目

代码语言:javascript
复制
KeyedCollection<string, Operation> Temporary;
Temporary = LoadedConfig;
foreach (var testOp in Temporary.ToList())
{
    if (!PerformTestOpListBox.Items.Contains(testOp.Name))
    {
        Temporary.Remove(testOp.Name);
    }
}
StagingConfig = Temporary;

通过这样做,如果Temporary不包含这样的项,它应该在ListBox中删除该项,但不知怎么我发现它也将在LoadedConfig中删除相同的项。怎么会发生这种事?有什么办法可以避免吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-09 18:23:33

所以,您的StagingConfig是空的。让我们创建一个从KeyedCollection派生的类,这样您就可以将它设置为非空的东西,然后填充它:

代码语言:javascript
复制
public class OperationKeyedCollection : KeyedCollection<string, Operation>
{
    protected override string GetKeyForItem(Operation item) => item.Name;
}

然后,您可以创建一个实例:

代码语言:javascript
复制
StagingConfig = new OperationKeyedCollection();

最坏的情况是:在配置字典中迭代一百万项,只有当它们存在于包含10个项的列表中时,才会添加它们。使用10的列表作为驱动源会更好,因为键控集合可以非常快地在字典中查找这些列表项。如果我们列举了一百万个项目,在一个包含10个项目的列表中查找它们,它们中的大多数就不会存在了,这是我们在检查所有10个项目之后才能确定的事实。这意味着你正在进行1000万次比较。把它翻过来,使用10的列表,你就会问一本字典“你有”只有10次。字典可以在一次之后回答这个问题,可能只是一次检查,所以你做的更像是10次检查,而不是1,000万次

代码语言:javascript
复制
foreach (var opName PerformTestOpListBox.Items)
{
    if (LoadedConfig.TryGetValue(opName, out var op))
    {
        StagingConfig.Add(op);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70643735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档