使用索引器为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
文档与实现佐证
虽然官方文档没有单独针对索引器的插入顺序做高亮说明,但从以下两点可以确认这是受保证的行为:
- 官方文档的整体契约:
OrderedDictionary<TKey,TValue>的官方描述明确指出它"维护元素的插入顺序",所有添加新元素的公共API操作(包括索引器set)都属于这个契约的一部分; - .NET源码实现:查看.NET 9的
OrderedDictionary<TKey,TValue>源码,索引器的set方法在检测到键不存在时,会调用Insert(Count, key, value)将元素插入到集合的最后位置,这是明确的、属于公共API承诺的实现逻辑,不会在后续版本中随意变更。
内容的提问来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

