gpt4 book ai didi

c# - PowerCollections 中 GetValueElseAdd 的 BCL 等价物是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:01 25 4
gpt4 key购买 nike

在 Wintellect 的 PowerCollections 中,有一个 GetValueElseAdd 是这样工作的:

if ( collection.GetValueElseAdd( key, ref value))
{
// just added, value unmodified
}

或者

// factory method only gets called if the key is not present.
if ( collection.GetValueElseAdd( key, out value, () => thingFactory.CreateNew()))
{
// just added; value contains factory result
}

在这两种情况下,都只需要一次遍历散列来隔离值所在的位置。 (有关权衡的更多讨论,请参阅 What happens to C# Dictionary<int, int> lookup if the key does not exist?)

问题是,为什么像这样的功能没有进入 BCL,特别是考虑到几乎所有其他 PowerCollections 都通过 3.5/LINQ 被吸纳并且 4.0 中添加了新集合?

是不是因为一般的使用模式是只执行一次Add,而您通常只通过一次哈希表查找找到与TryGetValue 路径等效的路径大部分时间?

是不是因为这在树中比在哈希表中更有值(value)(可能是 only find this implementation 在网上,但我认为它不仅仅是一个 OrderedList 集合)

编辑:另请参阅评论中链接的关于 Fredrik 的回复的帖子,其中讨论了集合的同步变体的多线程注意事项。

或者我还缺少另一个成语?要是 Peter Golde 在就好了!

最佳答案

我能想到的唯一可能反对 GetValueElseAdd 的理由是单一职责原则。方法名称表明该方法有两个职责:它尝试获取项目,如果失败,则添加该项目(我从未使用过 PowerCollections,但我会假设 value 在找不到 key 的情况下分配给创建的对象。

如果我正在设计 API,再加上行为易于创建和封装这一事实,可能足以阻止我实现它。

我通常会在方法名称开始包含诸如 AndOrElse 等词时立即退后一步,例如这些对我来说是该方法可能有太多责任的指标。

关于c# - PowerCollections 中 GetValueElseAdd 的 BCL 等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com