目录

介绍

兴趣点


我的CSV列数据中有些不符合列名顺序。将数据字典枚举为KeyValuePair不会以任何特定顺序返回数据,并且使用System.Collection.Specialized的OrderedDictionary很麻烦。因此,我创建了自己的有序词典,称为ListDictionary,本技巧文章中对此进行了讨论。

  • 下载源2.7 KB

介绍

我一直在使用CSV脚本,将List<string>列名称和Dictionary<string, object>列数据暂存起来。我意识到我的某些列数据不符合列名顺序。事实证明,将数据Dictionary枚举为KeyValuePair 并不会以任何特定的顺序返回数据。所以我需要一本有序的字典。

网上的文章说使用System.Collection.Specialized的OrderedDictionary。太好了,它是可排序的!但这不是“通用”的,而是对象到对象的,需要在整个地方进行映射以实现轻载。

所以我说:“不管了!” 并决定写点东西做这份工作。它的内部可以快速查找Dictionary,而List内部则可以使事情井井有条。我叫它ListDictionary。我不是为处理大量数据而设计的,而是着眼于有序的行为,希望它对您有好处。

using System;
using System.Collections.Generic;
using System.Linq;namespace metastrings
{public class ListDictionary<K, V> where K : IComparable<K>{public List<KeyValuePair<K, V>> Entries => m_list;public IEnumerable<K> Keys => m_list.Select(kvp => kvp.Key);public IEnumerable<V> Values => m_list.Select(kvp => kvp.Value);public V this[K key]{get { return m_dict[key]; }set { Set(key, value); }}public int Count => m_list.Count;public bool ContainsKey(K key) => m_dict.ContainsKey(key);public K FirstKey => m_list[0].Key;public void Set(K key, V val){bool added = false;if (m_dict.ContainsKey(key)){for (int i = 0; i < m_list.Count; ++i){K curKey = m_list[i].Key;if (curKey.CompareTo(key) == 0){m_list[i] = new KeyValuePair<K, V>(key, val);added = true;break;}}}if (!added)m_list.Add(new KeyValuePair<K, V>(key, val));m_dict[key] = val;}private List<KeyValuePair<K, V>> m_list = new List<KeyValuePair<K, V>>();private Dictionary<K, V> m_dict = new Dictionary<K, V>();}
}

没什么。尚未完全完善,我只是添加了所需的内容和一些单元测试:

ListDictionary<string, int> dict = new ListDictionary<string, int>();dict["foo"] = 1;
dict["bar"] = 2;Assert.AreEqual(1, dict["foo"]);
Assert.AreEqual(2, dict["bar"]);Assert.AreEqual(2, dict.Count);Assert.AreEqual("foo", dict.FirstKey);Assert.AreEqual("foo", dict.Entries.First().Key);
Assert.AreEqual(1, dict.Entries.First().Value);Assert.AreEqual("bar", dict.Entries.Last().Key);
Assert.AreEqual(2, dict.Entries.Last().Value);Assert.IsTrue(dict.Keys.Contains("foo"));
Assert.IsTrue(dict.Values.Contains(1));Assert.IsTrue(dict.Keys.Contains("bar"));
Assert.IsTrue(dict.Values.Contains(2));Assert.IsTrue(dict.ContainsKey("foo"));
Assert.IsTrue(dict.ContainsKey("bar"));
Assert.IsTrue(!dict.ContainsKey("blet"));dict["foo"] = 42;
Assert.AreEqual(42, dict["foo"]);

兴趣点

必须使用带有get和set的索引器。必须使用IComparable。用OrderedDictionary足够恨它。人们在.NET 2.0之前做了什么?

ListDictionary:改进的OrderedDictionary相关推荐

  1. 十大算法,描述+代码+演示+分析+改进(赶紧收藏!)

    十大算法 1.冒泡排序 ​ (1)算法描述 ​ 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  2. H265与ffmpeg改进开发

    H265与ffmpeg改进开发 Introduction KSC265是集编码.解码于一体的H.265编解码软件,完全遵循H.265协议标准.符合H.265编码规范的视频都可以通过KSC265进行解码 ...

  3. 语义分割改进:通过视频传播和标签松弛

    语义分割改进:通过视频传播和标签松弛 Improving Semantic Segmentation via Video Propagation and Label Relaxation 论文地址:h ...

  4. 《小团团团队》第五次作业:项目需求分析改进与系统设计

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验九 团队作业5-团队项目需求改进与系统设计 团队名称 小团团团队 作业学习目标 (1)掌握面向对象需求分析方法:(2) ...

  5. #时间预测算法_改进的智慧交通系统出行时间预测算法

    引用 Chowdhury N K, Leung C K S. Improved travel time prediction algorithms for intelligent transporta ...

  6. datax 不识别字段过滤_卷烟厂工艺空调混风段板式过滤器改进与应用

    0 引言 为了保证卷烟的品质,卷烟厂在卷烟生产过程中需要利用工艺空调来保持生产环境温湿度的稳定.但由于卷烟生产过程的特殊性,在烟叶烟丝的加工处理阶段.烟丝的运输阶段.卷烟的制作阶段等都会产生大量的粉尘 ...

  7. 基于熵权法优劣解距离法_维普资讯中文期刊服务平台-基于改进TOPSIS方法的航空装备预研项目技术风险评估...

    摘 要:技术风险是引发费用风险和进度风险的主要因素,因此在航空装备的研制中需要重点管控和规避.为提供可靠的航空装备预研项目技术方案的选择依据,采用改进的TOPSIS方法对五种不同航空装备预研方案的技术 ...

  8. 【目标检测】(8) ASPP改进加强特征提取模块,附Tensorflow完整代码

    各位同学好,最近想改进一下YOLOV4的SPP加强特征提取模块,看到很多论文中都使用语义分割中的ASPP模块来改进,今天用Tensorflow复现一下代码. YOLOV4的主干网络代码可见我上一篇文章 ...

  9. 【目标检测】(6) YOLOV2 目标检测在V1基础上的改进

    各位同学好,今天和大家分享一下 YOLOV2 目标检测算法的原理,建议大家先学习一下 YOLOV1,可以看我的上一篇文章:https://blog.csdn.net/dgvv4/article/det ...

最新文章

  1. android开发过程中项目中遇到的坑----布点问题
  2. Win11让AMD很受伤:CPU游戏性能下降15%,官方建议暂时别升级
  3. win7只能管理计算机软件吗,win7可以管理多少内存,win7内存优化软件
  4. CSS魔法堂:那个被我们忽略的outline
  5. 基于OpenCV的摄像头视频录制保存工具【附GIT源码地址】
  6. 牛客16662 津津的储蓄计划
  7. 为何你的 SaaS 想法总是失败?没想清楚这 4 个原因可能会继续失败!
  8. C语言枚举类型(Enum)
  9. delphi中exit,abort,break,continue 的区别
  10. 网络七层,五层,四层模型,数据封装、解封装,进制转换。
  11. 405.数字转换为十六进制数
  12. UEFI开发探索75- YIE001PCIe开发板(08 跑马灯实验)
  13. g6的minimap中的配置_Minimap 缩略图
  14. 【ARM】程序快速定位segmentation fault core dumped错误
  15. 跟着团子学SAP PS:项目模版搭建 CJ91/CJ92/CJ93/CN01/CN02/CN03/CN11/CN12/CN13
  16. 有趣的灵魂用有趣的屏保SadMac.saver
  17. 使用Linkage Mapper制作环境连接图
  18. 掌纹与掌静脉融合matlab代码,手形、掌纹和掌静脉多特征融合识别
  19. 威锋VL820是USB 3.1 2代集线器控制器
  20. 我的世界服务器附魔修改器,我的世界附魔辅助器

热门文章

  1. ajax获取java session的值_jquery 怎么获取 ajax中的session值
  2. php post请求后端拿不到值_PHP解决Vue发起POST请求,接收不到数据
  3. UI设计干货模板|引导网格系统
  4. keytool生成证书_基于 TrueLicense 的项目证书验证
  5. mysql日志输出到syslog_在chroot环境下将MySQL日志输出到syslog
  6. KVM Tracing, perf_events
  7. Linux内存管理:Swap介绍以及如何使交换具有可扩展性
  8. Python基础学习思维导图
  9. HugeTLB Pages大页内存
  10. C语言插件开发模式与分析