You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用索引器为OrderedDictionary<TKey,TValue>赋值是否属于保序插入?

关于.NET 9 OrderedDictionary<TKey,TValue>索引器插入顺序的保证

你的测试结果完全符合预期,通过索引器在键不存在时设置值,属于官方明确保证的、会维护插入顺序的行为,并非仅依赖实现细节。

核心逻辑说明

OrderedDictionary<TKey,TValue>的核心特性就是维护元素的插入顺序,所有向集合中添加新元素的操作(包括索引器的set操作)都遵循这个规则:

  • 当键不存在时,dict[key] = value会将新的键值对追加到集合的末尾,行为等价于调用Add(key, value)方法;
  • 当键已存在时,仅会更新对应的值,不会改变该键在集合中的位置。

结合测试代码验证

你的测试代码运行结果foo=True, xxx=False, baz=False, boo=True完全符合有序字典的行为规则:

OrderedDictionary<string, bool> dict = new();
dict["foo"] = true;       // 插入到末尾,顺序:foo
dict["bar"] = false;      // 插入到末尾,顺序:foo, bar
dict["baz"] = true;       // 插入到末尾,顺序:foo, bar, baz
dict.RemoveAt(1);         // 移除bar,顺序:foo, baz
dict["boo"] = true;       // 插入到末尾,顺序:foo, baz, boo
dict.Insert(1, "xxx", false); // 在索引1插入xxx,顺序:foo, xxx, baz, boo
dict["baz"] = false;      // 更新baz的值,位置不变
string dictValues = "";
foreach (KeyValuePair<string, bool> entry in dict) {
    dictValues += $", {entry.Key}={entry.Value}";
}
dictValues = dictValues[2..]; // 结果:foo=True, xxx=False, baz=False, boo=True

文档与实现佐证

虽然官方文档没有单独针对索引器的插入顺序做高亮说明,但从以下两点可以确认这是受保证的行为:

  1. 官方文档的整体契约:OrderedDictionary<TKey,TValue>的官方描述明确指出它"维护元素的插入顺序",所有添加新元素的公共API操作(包括索引器set)都属于这个契约的一部分;
  2. .NET源码实现:查看.NET 9的OrderedDictionary<TKey,TValue>源码,索引器的set方法在检测到键不存在时,会调用Insert(Count, key, value)将元素插入到集合的最后位置,这是明确的、属于公共API承诺的实现逻辑,不会在后续版本中随意变更。

内容的提问来源于stack exchange,提问作者Jez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:20:13