Lookup类

Dictionary<Tkey,TValue>仅仅为每一个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义.

Lookup<Tkey,TElement>的方法和属性例如以下表:

属性名或者方法名

说明

Count

属性Count返回集合中的元素个数

Item

使用索引器能够依据键訪问特定的元素.由于同一个键能够相应多个值,所以这个属性返回全部值的枚举

Contain()

方法Contains()依据使用用Key參数传送元素,返回一个布尔值

ApplyResultSelector()

ApplyResultSelector(0依据传送给它的转换函数,转换每一项,返回一个集合

Loopup<TKey,TElement>不能像一般的字典那样创建,而必须调用方法ToLookup(),它返回一个Lookup<TKey,TElement>对象.方法ToLookup()是一个扩展方法,能够用于实现了IEnumerable<T>的全部类.

当一个Key要求相应多个value情况ToLookup方法很实用,ToLookup返回一种特殊的数据结构,类似SQL中的group,能够把集合分组而且能够用索引訪问这些元素,案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Lookup类

{

class Program

{

static void Main(string[] args)

{

//创建一个string类型的数组

string[] array = { "cat","dog","horse"};

//生成查找结构

var lookup = array.ToLookup(item => item.Length);

//枚举字符长度3的串

foreach (var item in lookup[3])

{

Console.WriteLine("3 = "+item);

}

//枚举字符长度5的串

foreach (var item in lookup[5])

{

Console.WriteLine("5 = " + item);

}

//枚举分组

foreach (var grouping in lookup)

{

Console.WriteLine("Grouping : ");

foreach (var item in grouping)

{

Console.WriteLine(item);

}

}

Console.ReadKey();

}

}

}

上面的案例是通过数组元素的字符串长度为Key分组,也就是字符长度同样的元素的Key是一样的,索引下标也是一样.比方以通过lookup[3]訪问,而horse要用lookup[5]来訪问.

有序字典

SortedDictionary<TKey,TValue>类是一个二叉搜索树,当中的元素依据键来排序.该键类型必须实现IComparable<TKey>接口.假设键的类型不能排序,则还能够创建一个实现了IComparer<TKey>接口的比較器,将比較器用作有序字典的构造函数的一个參数.

SortedDictionary<TKey,TValue>类和SortedList<TKey,TValue>类的功能类似.但由于SortedList<TKey,TValue>实现为一个基于数组的列表,而SortedDictionary<TKey,TValye>类实现为一个字典,所以他们有不同的特征:

1.SortedList<Tkey,TValue>类使用的内存比SortedDictionary<TKey,TValue>类少

2.SortedDictionary<TKey,TValue>类的元素插入和删除速度比較快

3.在用已排好序的数据填充集合时,若不须要改动容量,SortedList<TKey,TValue>类就比較快.

案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace 有序字典

{

class Program

{

static void Main(string[] args)

{

//SortedList<TKey,TValue>使用的内存少

//SortedDictionary<TKey,TValue>元素插入和删除速度快

//键要实现IComparable<in T>接口

SortedDictionary<EmployeeID, Person> sd = new SortedDictionary<EmployeeID, Person>();

sd.Add(new EmployeeID(3),new Person("中国", "张飞", 40));

sd.Add(new EmployeeID(20), new Person("中国", "关羽", 43));

sd.Add(new EmployeeID(4), new Person("中国", "刘备", 45));

sd.Add(new EmployeeID(5), new Person("中国", "诸葛亮", 24));

sd.Add(new EmployeeID(1), new Person("美国", "豪威尔", 40));

sd.Add(new EmployeeID(0),new Person("美国", "奥巴马", 40));

sd.Add(new EmployeeID(210), new Person("朝鲜", "金三胖", 40));

sd.Add(new EmployeeID(80), new Person("印度", "印度阿三", 40));

foreach (var item in sd)

{

Console.WriteLine(item.Key.ID+","+item.Value.Name);//键。正序排序

}

Console.ReadKey();

}

}

public class EmployeeID : IComparable<EmployeeID>

{

public int ID { get; private set; }

public EmployeeID(int id)

{

this.ID = id;

}

public int CompareTo(EmployeeID other)

{

return ID.CompareTo(other.ID);

}

}

public class Person

{

public string Country { get; private set; }

public string Name { get; private set; }

public int Age { get; private set; }

public Person(string country, string name, int age)

{

this.Country = country;

this.Name = name;

this.Age = age;

}

}

}

注意:SortedList类使用的内存比SortedDictionary类少,但SortedDictionary类在插入和删除未排序的数据时比較快.

具体分析SOrtedList和SortedDictionary类的不同,SortedList内部用数组保存,仅仅能算是有序线性表,而SortedSictionary的内部结构是红黑树(这是一种数据结构,不懂得自己去百度).

SortedDictionary内部结构是红黑树,红黑树的平衡二叉树的一种,SortedList是有序线性表,内部结构是Array,运用了二分查找法提高效率.从两者查找,插入,删除操作的时间复杂度来看,都为O(LogN),分辨不出优劣,但内部结构的不同导致了实际操作的性能差异.

SortedList和SortedDictionary性能比較----插入

因为SortedList用数组保存,每次进行插入操作时,首先用二分查找发找到对应的位置,得到位置以后,SortedList会把该位置以后的值依次往后移动一个位置,空出当前位,再把值插入,这个过程用到了Array.Copy方法,而调用该方法是比較损耗性能的,代码例如以下:

private void Insert(int index,TKey key,TValue value)

{

...

if(index<this._size)

{

Array.Copy(this.keys.index,this.keys,index+1,this._size-index);

Array.Copy(this.values,index,this.values,index+1,this._size-index);

}

...

}

SortedDictionary在加入操作时,仅仅会依据红黑树的特性,旋转节点,保持平衡,并没有对Array.Copy的调用.

測试代码:循环一个int型,容量为100000的随机数组,分别用SortedList和SortedDictionary加入.

结论:在大量加入操作的情况下,SortedDictionary性能优于DortedList.

SortedList和SortedDictionary性能比較----查询

两者的查询操作中,事件复杂度都为O(LogN),且源代码中也没有额外的操作造成性能损失.

经过測试得出:两者在循环10W次的情况下,只相差几十毫秒,能够看出两者的查询操作性能相差不大.

SortedList和SortedDictionary性能比較----删除

从加入操作的案例能够看出,因为SortedList内部使用数组进行存储数据,而数组本身的局限性使得SortedList大部分的加入操作都要滴啊用Array.Copy方法,从而导致了性能的损失,这样的情况相同存在于删除操作中.所以得出了:在大量删除操作的情况下是,SortedDictionary的性能优于SortedList.

总结:SortedDictionary内部用红黑树存储数据,SortedList用数组存储数据,两者的查询效率几乎相同,但因为数组本身的限制,在大量加入删除操作的情况下,SortedDictionary的性能优于SortedList.

转载于:https://www.cnblogs.com/lytwajue/p/6895947.html

C#高级编程五十四天----Lookup类和有序字典相关推荐

  1. C#编程(五十四)----------Lookup类和有序字典

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47071607 Lookup类 Dictionary<Tkey,TValue> ...

  2. c++面向对象高级编程 学习十四 引用

    文章目录 reference reference的常见用途 reference 变量有三种形式:值,指针,引用 int x=0; //值 int* p=&x;//指向整型的指针,地址,指针在之 ...

  3. 软考高级系统架构设计师系列论文五十四:论软件设计模式及应用

    软考高级系统架构设计师系列论文五十四:论软件设计模式及应用 一.设计模式相关技术知识点 二.摘要 三.正文 四.总结 一.设计模式相关技术知识点 写论文前充分了解设计模式相关的知识点,并把这些知识点应 ...

  4. Python编程基础:第五十四节 排序Sort

    第五十四节 排序Sort 前言 实践 前言 我们常需要对列表.元组中的元素进行排序,例如按照字母表排列学生的名称.这里就需要用到列表的sort()方法,以及sorted()函数. 实践 我们先来构建一 ...

  5. [Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理

    首先,祝大家教师节和中秋节快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文 ...

  6. 孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档

    孤荷凌寒自学python第五十四天使用python来删除Firebase数据库中的文档 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数据库 ...

  7. Gradle 1.12用户指南翻译——第五十四章. 构建原生二进制文件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  8. 信息系统项目管理师核心考点(五十四)配置项分类、状态与版本

    科科过为您带来软考信息系统项目管理师核心重点考点(五十四)配置项分类.状态与版本,内含思维导图+真题 [信息系统项目管理师核心考点]配置项分类.状态与版本 一.典型配置项 项目计划书.需求文档.设计文 ...

  9. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

最新文章

  1. vagrant安装及使用方法
  2. DL之pix2pix:基于TF利用pix2pix模型对food_resized数据集实现Auto Color自动上色技术—训练测试过程全记录
  3. 华为读取版本exe_关于esrv_svc.exe和SurSvc.exe疑似泄露用户信息的猜测
  4. 【FLink】Flink exactly once 每次都是产生一个新的生产者吗?
  5. Django:ORM基本操作-CRUD,管理器对象objects,----->聚合查询、原生数据库操作
  6. 数据库:mysql内置功能-函数
  7. 《计算机系统:系统架构与操作系统的高度集成》——3.2 处理器实现涉及什么...
  8. MongoDB Hot Backup 测试及痛点
  9. eclipse下的tomcat内存设置大小(转)
  10. python音频实时频谱分析_基于python的音频设计及频谱分析
  11. 七夕祝福网页制作_啥?七夕过了你还不知道自己为啥单身??
  12. 基础才是王道——TCP/IP详解学习笔记
  13. Word 2019 更改默认模板的字体设置
  14. html页面pc端显示正常,手机端页面整体偏左(兼容性处理)
  15. 百度接口API的使用
  16. Openstack Kilo安装错误汇总
  17. java 字节码查看_一种查看java字节码时显示方法调用关系图的方法与流程
  18. 【恩墨学院】为什么用尽了办法你的系统性能还是不见改善?
  19. 操作系统:Win10自带的8个基本功能非常实用
  20. 2次成功投诉EMS和中国移动的经验

热门文章

  1. 2011年最佳入门指南
  2. 2022年GDCPC广东省大学生程序设计竞赛题解
  3. PHP接收云之家审批结果,云之家新一代智能协同云:一站式解决企事业单位收发文管理...
  4. 电脑小知识:电脑怎么选择操作系统?XP、Win7、Win10该用哪个?
  5. android中radiogroup作用,Android View系列---RadioGroup与RadioButton
  6. IIC读写EEPROM
  7. 关于学生毕业论文的建议
  8. 来深圳这三年我都经历了什么,一个深漂青年的所思所想
  9. Django 中The 'image' attribute has no file associated with it.出错问题的解决
  10. 使用阿里云服务器搭建个人网盘遇到的问题