`
nlx0201
  • 浏览: 28828 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C#数据结构和算法学习系列十一----构建字典DictionaryBase 类和SortedList 类

 
阅读更多

字典是一种把数据作为键值对来存储的数据结构。作为一种抽象的类,DictionaryBase 类可以用来实现不同的数据结构,其中这些数据结构全部把数据存储成键值对。这些数据结构可能是散列表、链表或者其他一些数据结构类型。SortedList类是按照分类顺序基于键值来存储键值对的。这是一种有趣的数据结构,因为通过引用数据结构中值的索引位置也可以访问到存储在结构中的数据,这也使得结构的行为在某些方面和数组很相像。

A.Dictionary类。DictionaryBase 类是一种用作专有字典实现基础的抽象(MusInherit)类。存储在字典中的键值对实际上是作为DictionaryEntry 对象来存储的。DictionaryEntry 结构提供了两个域,一个用于关键字而另一个用于值。在这个结构中所要关注的只是Key 属性和Value 属性这两个属性(或方法)。当把键值对录入到字典内的时候,这些方法会返回存储的值。DictionaryBase 类实际上实现了来自System.Collections 名字空间的界面,即IDictionary。

1.DictionaryBase 类的基础方法和属性。在用字典对象进行操作的时候需要执行几种操作。就最少操作数量而言,需要Add 方法来添加新数据,需要Item 方法来取回数值,需要Remove 方法来移除掉键值对,还需要Clear方法来清除所有数据的数据结构。实例如下:

public class IPAddresses : DictionaryBase
{
     public IPAddresses()
     {
     }
     public void Add(string name, string ip)
     {
          base.InnerHashtable.Add(name, ip);
     }
     public string Item(string name)
     {
          return base.InnerHashtable[name].ToString();
     }
     public void Remove(string name)
     {
          base.InnerHashtable.Remove(name);
     }
}

相应调用如下:

class chapter11
{
     static void Main()
     {
          IPAddresses myIPs = new IPAddresses();
          myIPs.Add(" Mike", "192.155.12.1");
          myIPs.Add(" David", "192.155.12.2");
          myIPs.Add(" Bernica", "192.155.12.3");
          Console.WriteLine("There are " + myIPs.Count + " IP addresses");
          Console.WriteLine("David's ip address: " + myIPs.Item("David"));
          myIPs.Clear();
          Console.WriteLine("There are " + myIPs.Count + " IP addresses");
     }
}

这里还有其他两种方法, 它们都是DictionaryBase 类的成员: CopyTo 方法和GetEnumerator 方法。CopyTo 方法把字典的内容复制给一维的数组。尽管可以把数组声明成Object,然后用CType 函数把对象转换成为DictionaryEntry,但是这里应该把数组声明成DictionaryEntry数组。

IPAddresses myIPs = new IPAddresses(@"c:\ips.txt ");
DictionaryEntry[] ips = new DictionaryEntry[myIPs.Count-1];
myIPs.CopyTo(ips, 0);

B.KeyValuePair类
C#语言提供了一种小类用来允许创建象字典式的对象,此对象是基于关键字来存储数据的。这种类被称为是KeyValuePair 类。由于每个对象只能持有一个关键字和一个值,所以它的使用是受到限制的。实例化:

KeyValuePair<string, int> mcmillan = new KeyValuePair<string, int>("McMillan", 99);

如果把对象放置在数组内,那么KeyValuePair 类是比较好用的。下列程序举例说明如何实现简单等级书:

using System;
using System.Collections.Generic;
using System.Text;
namespace Generics
{
     class Program
     {
          static void Main(string[] args)
          {
               KeyValuePair<string, int>[] gradeBook = new KeyValuePair<string,
int>[10];
               gradeBook[0] = new KeyValuePair<string,int>("McMillan", 99);
               gradeBook[1] = new KeyValuePair<string,int>("Ruff", 64);
               for (int i = 0; i <= gradeBook.GetUpperBound(0); i++)
                    if (gradeBook[i].Value != 0)
                         Console.WriteLine(gradeBook[i].Key + ": " +
gradeBook[i].Value);
               Console.Read();
          }
     }
}

C.SortedList 是按照分类顺序基于键值来存储键值对。当存储的关键字很重要时可以使用这种数据结构。比如,在标准词典中希望所存储的词是按照字母的顺序存储的情况。
1.SortedList 类的使用。实例化如下:

SortedList myips = new SortedList();
myips.Add("Mike", "192.155.12.1");
myips.Add("David", "192.155.12.2");
myips.Add("Bernica", "192.155.12.3");

SortedList 类的通用版本允许确定关键字和值两者的数据类型:SortedList<Tkey, TValue>。类似用法同Dictionay类

总结:DictionaryBase 类是用来创建用户字典的抽象类。而字典则是利用散列表(或者有时为单独的链表)作为潜在的数据结构来把数据存储到键值对内的一种数据结构。键值对作为DictionaryEntry 对象来进行存储, 而且必须使用Key 方法和Value 方法来取回DictionaryEntry 对象中的实际值。当程序员需要创建强类型的数据结构的时候,经常会用到DictionaryBase 类。通常情况下会把添加给字典的数据作为Object 来存储,但是对于自定义字典而言,程序员可能会削减需要执行的类型转换的数量,从而使得程序变得更加有效且更易于阅读。SortedList 类是Dictionary 类的一种特殊类型。它会按照分类的顺序通过关键字来存储键值对。此外,也可以通过引用索引数的方式来取回存储在SortedList 中的值,其中索引数是存储数值的位置,这和使用数组非常相似。在System.Collections.Generic 名字域中还有SortedDictionary 可以像通用SortedList 类一样操作。
分享到:
评论

相关推荐

    数据结构与算法(C#)

    第9章 构建字典:DictionaryBase类和SortedList类 第10章 散列和Hashtaboe类 第11章 链表 第12章 二叉树和二叉查找树 第13章 集合 第14章 高级排序算法 第15章 用于查找的高级数据结构和算法 第16章 图和图的算法 第...

    C#中构建字典: DictionaryBase和SortedList类

    使用DictionaryBase开发电话本 phonebook 应具有的功能 Add添加联系人 Remove删除联系人 Count获取联系人数 Clear清空联系人 Item获取联系人信息 索引器 保存至硬盘/ 从硬盘读取 思考:如何存储多个信息

    数据结构与算法:语言描述(中英文)

    字典和基于字典的不同数据结构把数据作为键/值对来存储。本章向读者说明了如何创建基于DictionaryBase类的他或她自己的类。DictionaryBase类是一个抽象类。第10章包括散列表和HashTable类。HashTable类是字典的一种...

    基于Linux V4L2视频库、ASLA高级声音框架的远程视频及语音聊天.zip

    基于Linux V4L2视频库、ASLA高级声音框架的远程视频及语音聊天

    node-v8.7.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.7.3-linux-armv6l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    香色闺阁 2.56.1.ipa

    香色闺阁 2.56.1.ipa

    基于python智能监考系统人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+源代码+注释说明+演示视频.zip

    基于python实现的智能监考系统,人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+源代码+注释说明+演示视频 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。

    CGnetsw.exe

    CGnetsw.exe

    node-v0.10.40.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    并行计算简介.pptx

    并行计算简介.pptx

    lyra默认地图玩家登录流程

    lyra默认地图玩家登录流程

    域名防封防报毒网站程序PHP开源源码.rar

    域名防封防报毒网站程序PHP开源源码.rar域名防封防报毒网站程序PHP开源源码.rar

    智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip

    智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip 智能监考系统(机试) 人脸信息采集识别签到+微机电脑录屏+前置摄像头录屏+违法外设检测+违法进程检测关闭(含视频).zip

    毕设绝技-段子发布平台(ssm-vue)

    设计一个基于SSM(Spring, Spring MVC, MyBatis)后端框架和Vue.js前端框架的段子发布平台,可以划分为以下几个关键步骤: 1. 项目概述 目标:开发一个用户友好的段子发布、浏览和互动平台。 特点:用户注册、登录、发布段子、浏览段子、点赞、评论、分享等。 2. 技术栈选择 后端:Java(JDK 1.8 或更高版本),SSM框架(Spring Boot 2.x, Spring MVC, MyBatis)。 前端:Vue.js 2.x 或 3.x,Vue Router,Vuex(可选),Axios(用于发送HTTP请求)。 数据库:MySQL 5.7 或更高版本。 开发工具:IntelliJ IDEA 或 Visual Studio Code,Maven(或Gradle)项目管理工具。 3. 需求分析 用户注册与登录:用户需要能够注册新的账号并登录系统。 发布段子:用户应该能够发布包含文本、图片(可选)的段子。 浏览段子:用户可以浏览热门段子、最新段子或特定用户的段子。 点赞与评论:用户可以对段子进行点赞和评论。

    REALTEK RTS3901、3901L、3902L芯片应用开发评估板Cadence原理图+PADS PCB图文件.zip

    REALTEK RTS3901、RTS3901L、RTS3902L芯片应用开发评估板Cadence原理图+PADS PCB图文件

    kangle虚拟主机后台管理系统销售管理系统源码.rar

    kangle虚拟主机后台管理系统销售管理系统源码.rarkangle虚拟主机后台管理系统销售管理系统源码.rar

    基于Qt+C++开发的智力数独游戏+源码(毕业设计&课程设计&项目开发)

    基于Qt+C++开发的智力数独游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt+C++开发的智力数独游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt+C++开发的智力数独游戏+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: exe为可执行文件,可直接运行 提供计时、暂停、重开、提示、删除、不同难度和关卡选择随机生成数独的功能。

    node-v9.2.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics