C# 手搓一个OrderedDictionary

news/2025/2/21 2:49:06/文章来源:https://www.cnblogs.com/itheo/p/18723969

注意: 粗糙版手账,未经测试,请谨慎使用

Check.NotNull: 别处定义的帮助类方法,与主要功能无关

using System;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Linq;namespace System.Collections.Generic
{public class OrderedDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue>{private readonly List<TKey> _keys;private readonly List<TValue> _values;private readonly IEqualityComparer<TKey> _comparer;private bool _isReadOnly;private readonly object _lock = new object();public OrderedDictionary(){_keys = new List<TKey>();_values = new List<TValue>();_comparer = EqualityComparer<TKey>.Default;}public OrderedDictionary(IEqualityComparer<TKey> comparer){_comparer = comparer ?? EqualityComparer<TKey>.Default;}public OrderedDictionary(IEnumerable<KeyValuePair<TKey, TValue>> collection, IEqualityComparer<TKey> comparer){Check.NotNull(collection, nameof(collection));_keys = collection.Select(x => x.Key).ToList();_values = collection.Select(x => x.Value).ToList();_comparer = comparer ?? EqualityComparer<TKey>.Default;}public OrderedDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer){Check.NotNull(dictionary, nameof(dict));_keys = dictionary.Keys.ToList();_values = dictionary.Values.ToList();_comparer = comparer ?? EqualityComparer<TKey>.Default;}public ICollection<TKey> Keys => _keys;public ICollection<TValue> Values => _values;public IEqualityComparer<TKey> Comparer => _comparer;public int Count => Keys.Count;public bool IsReadOnly => _isReadOnly;IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys => Keys;IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values => Values;public TValue this[TKey key]{get{for (int i = 0; i < Count; i++){if (_comparer.Equals(key, _keys[i])){return _values[i];}}throw new KeyNotFoundException($"The given key `{key}` was not present in the dictionary.");}set{if (IsReadOnly){throw new InvalidOperationException("The dictionary is read-only.");}lock (_lock){bool found = false;for (int i = 0; i < Count; i++){if (_comparer.Equals(key, _keys[i])){found = true;_values[i] = value;}}if (!found){Add(key, value);}}}}private void CheckReadOnly(){if (IsReadOnly){throw new InvalidOperationException("The dictionary is read-only.");}}public void Add(TKey key, TValue value){CheckReadOnly();lock (_lock){if (ContainsKey(key)){throw new ArgumentException($"An item with the same key has already been added. Key: {key}");}_keys.Add(key);_values.Add(value);}}public bool ContainsKey(TKey key){return Keys.Contains(key, _comparer);}public bool Remove(TKey key){CheckReadOnly();lock (_lock){for (int i = 0; i < Count; i++){if (_comparer.Equals(key, _keys[i])){_keys.RemoveAt(i);_values.RemoveAt(i);return true;}}return false;}}public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value){for (int i = 0; i < Count; i++){if (_comparer.Equals(key, _keys[i])){value = _values[i];return true;}}value = default;return false;}public void Add(KeyValuePair<TKey, TValue> item){Check.NotNull(item, nameof(item));Add(item.Key, item.Value);}public void Clear(){CheckReadOnly();lock (_lock){_keys.Clear();_values.Clear();}}public bool Contains(KeyValuePair<TKey, TValue> item){Check.NotNull(item, nameof(item));return ContainsKey(item.Key);}public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex){Check.NotNull(array, nameof(array));if (arrayIndex > array.Length){throw new ArgumentOutOfRangeException(nameof(arrayIndex));}if (array.Length - arrayIndex < Count){throw new ArgumentException("The array is too small.");}int count = Count;for (int i = 0; i < count; i++){array[arrayIndex++] = new KeyValuePair<TKey, TValue>(_keys[i], _values[i]);}}public bool Remove(KeyValuePair<TKey, TValue> item){Check.NotNull(item, nameof(item));return Remove(item.Key);}public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator(){for (int i = 0; i < Count; i++)yield return new KeyValuePair<TKey, TValue>(_keys[i], _values[i]);}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion AI绘图教程:从基础到高级,AI绘图一网打尽

在 AI 绘画领域,StableDiffusion 以其强大的功能和丰富的创意表现,成为众多创作者热衷探索的工具。今天,就为大家详细介绍一系列围绕 StableDiffusion 展开的学习资源,涵盖从基础到高阶、从功能解析到实际应用的全方位内容。 一、基础入门篇 kc开篇:“1 - 全面掌握 Stable…

龙哥量化:用deepseek编程要学习的公式编程的基础知识和常用的功能模块

龙哥微信:Long622889代写通达信技术指标、选股公式(通达信,同花顺,东方财富,大智慧,文华,博易,飞狐)代写期货量化策略(TB交易开拓者,文华8,金字塔)我自己在公式编程非常熟练了,但是遇到deepseek的时候,非常惊喜,能理解我的思路, 也能明白我提出的修改思路,真…

电商与ChatGPT结合:如何利用AI提升销售额,案例分析及应用策略

在当今数字化浪潮中,AI技术正以前所未有的速度渗透到各个行业,电商直播带货领域也不例外。 曾经一个5人团队,在团队规模恒定的情况下,巧妙借助ChatGPT与各类软件的融合之力,成功实现了年销售额从2000万跃升至2500万甚至3000万的飞跃,这无疑彰显了AI在电商领域的巨大潜力。…

逻辑推理

肯前比肯后 否后比否前 肯后否前无必然联系 前推后 如果 就 都 一定 后推前 只有 ...才 ... 除非。。。否则不 。。。 B -> A 除非。。。否则 。。。 -B -> A 谁必不可少 谁就在箭头后面 或关系 否一推一 如 A或B为真 -A->B/ -B-> A 快速做题 - 排除出现…

BTB04-ASEMI电动工具专用BTB04

BTB04-ASEMI电动工具专用BTB04编辑:ll BTB04-ASEMI电动工具专用BTB04 型号:BTB04 品牌:ASEMI 封装:TO-220F 正向电流:8A 反向电压:600V~800V 引脚数量:3 芯片个数:2 芯片尺寸: 漏电流:>10ua 恢复时间: 包装方式:管装 封装尺寸:如图 特性:双向可控硅 工作结温:…

10款最适合大数据项目管理工具(2025年)

在当今数据驱动的时代,大数据项目管理已成为企业成功的关键因素之一。随着数据量的爆炸式增长,传统的项目管理方法已无法满足需求,企业需要借助专业的软件工具来高效管理复杂的大数据项目。本文将为您介绍10款最适合大数据项目管理的软件工具,帮助您在2025年及未来更好地应…

第十六章 采购管理(2025年详细解析版)

目录导学什么是采购管理?定义内容16.1 管理基础什么是协议定义协议的形式什么是合同定义内容合同注意事项项目采购与项目管理项目买卖方内部卖方招投标的流程发展趋势和新兴实践(了解)采购新趋势16.2 项目采购管理过程项目采购管理过程ITTO裁剪时需要考虑的因素在敏捷或适应…

面试官:说说你项目中JWT的执行流程?

JWT 在目前的项目开发中使用到的频率是非常高的,因此它也是面试常问的一类问题,所以今天我们就来看看“项目中 JWT 的执行流程?”这个问题。 1.什么是 JWT? JWT(JSON Web Token) 是一种开放标准(RFC 7519),用于在网络应用间安全传输信息,通常用于身份验证和信息交换。…

【日记】文竹已经长得比路灯还要高了(1069 字)

正文最近陷入了一个深刻的情感漩涡。一边有些嫌恶爱情,一边又为它焦虑。一边觉得自己只有友谊已经足够了,一边又看见大多数友情并不能如爱情一般陪伴那样长的时间,不说二三十年,甚至不到十年可能便会消亡。觉得其实自己仍然需要它。然而目前这个不太喜欢、又需要一个东西的…

苹果使用AI让皮克斯的灯具复活了。

苹果让皮克斯著名的开场灯具复活,发布了一项新的研究,其中描述它的形容词并不是你通常会在AI研究中使用的那些。 这与我们习惯的一切都不同。它在技术上并不更聪明、更强大,也不是那些害怕AI的人噩梦般的存在。 相反,它似乎是科技巨头首次尝试以不同的方向提升AI和机器人智…

react-native-snap-carousel 轮播图卡在中间的问题

今天在使用react-native-snap-carousel组件的时候,发现一个问题,就是轮播有时候会卡在两个轮播图之间,不左不右的。研究了半天,才发现,开启动量滚动即可 关于enableMomentum的解释 enableMomentum 是 React Native 中 ScrollView 和 FlatList 组件的一个属性,用于控制滚动…