我试图在两个KeyedCollection之间移动项目
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中删除相同的项。怎么会发生这种事?有什么办法可以避免吗?
发布于 2022-01-09 18:23:33
所以,您的StagingConfig是空的。让我们创建一个从KeyedCollection派生的类,这样您就可以将它设置为非空的东西,然后填充它:
public class OperationKeyedCollection : KeyedCollection<string, Operation>
{
protected override string GetKeyForItem(Operation item) => item.Name;
}然后,您可以创建一个实例:
StagingConfig = new OperationKeyedCollection();最坏的情况是:在配置字典中迭代一百万项,只有当它们存在于包含10个项的列表中时,才会添加它们。使用10的列表作为驱动源会更好,因为键控集合可以非常快地在字典中查找这些列表项。如果我们列举了一百万个项目,在一个包含10个项目的列表中查找它们,它们中的大多数就不会存在了,这是我们在检查所有10个项目之后才能确定的事实。这意味着你正在进行1000万次比较。把它翻过来,使用10的列表,你就会问一本字典“你有”只有10次。字典可以在一次之后回答这个问题,可能只是一次检查,所以你做的更像是10次检查,而不是1,000万次
foreach (var opName PerformTestOpListBox.Items)
{
if (LoadedConfig.TryGetValue(opName, out var op))
{
StagingConfig.Add(op);
}
}https://stackoverflow.com/questions/70643735
复制相似问题