C#高级编程五十二天----有序列表

有序列表

如果需要基于对所有集合排序,就可以使用SortedList<TKey,TValue>类.这个类按照键给元素排序.这个集合中的值和键都可以使用任意类型.

下面的例子创建了一个有序列表,其中键和值类型都是string.默认的构造函数创建了一个空列表,再用Add()方法添加书.使用重载的构造函数.可以定义列表的容量,传递实现了IComparer<TKey>接口的对象,该接口用于给列表中的元素排序.

使用Add(Tkey,Tvalue)方法,第一个参数是键,第二个参数是值.除了使用Add()方法之外,还可以使用索引器添加元素到列表中.索引器需要把键作为索引参数.如果键已存在,Add()方法就抛出一个ArgumentException类型的异常.如果所引起使用相同的键,就用新值代替旧值.

SortedList<TKey,TValue>类只允许每个键有一个对应的值,如果需要每个键对应多个之,可以使用Lookup<TKey,TELement>类.

案例:

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>来给元素排序

SortedList<string, string> books = new SortedList<string, string>();

books.Add("tangseng", "001");

books.Add("sunwukong", "002");

books.Add("zhubajie", "003");

books.Add("shaheshang", "004");

//键是不允许重复,下面我们用Add方法重新添加一次tangseng

//books.Add("tangseng","hahah");抛出异常

//但是如果使用索引来赋值,如果键存在,则覆盖,不存在,相当于使用Add方法

books["tangseng"] = "hahaha";

foreach (var item in books.Keys)

{

Console.WriteLine(item);

}

foreach (var item in books.Values)

{

Console.WriteLine(item);

}

//一次性遍历键值

foreach (KeyValuePair<string, string> item in books)

{

Console.WriteLine("名字: {0} , 序号 : {1}", item.Key, item.Value);

}

/*

* 分析结果可知,tangseng被替换成了hahaha

*

* 下面简单介绍一下SortedList<TKey,TValue>中的方法与属性

* Capacity 这个属性用来设置与得到有序列表的容量,与IList一样,也时成倍增长的

* Comparer 返回与有序列表相关的比较器,可以从构造函数中传入该比较器

* Remove() RemoveAt() 按键删除与按索引删除

* ContainsKey();ContainsValue;检查是不是有包含指定值的键,或者值

* TryGetValue() 尝试获得指定键的值,如果有就是true,并用out把值带回来,没有就是false

*/

//按键删除

Console.WriteLine("按键删除");

books.Remove("tangseng");

foreach (KeyValuePair<string, string> item in books)

{

Console.WriteLine("名字 : {0}, 序号 : {1}", item.Key, item.Value);

}

//可以看出tangseng被删除了

//下面我们按索引删除

books.RemoveAt(0);

Console.WriteLine("按索引删除");

foreach (KeyValuePair<string, string> item in books)

{

Console.WriteLine("名字 : {0}, 序号 : {1}", item.Key, item.Value);

}

//结果中看出shaheshang被删除,证明删除索引是以排序后的顺序为准,不是以插入的顺序为准

//检查是否包含tangseng,检查是否包含zhubajie(键)

Console.WriteLine("检查是否包含tangseng: {0}", books.ContainsKey("tangseng"));

Console.WriteLine("检查是否包含zhubajie: {0}", books.ContainsKey("zhubajie"));

//检查是否包含001,检查是否包含002(值)

Console.WriteLine("是否包含001: {0}", books.ContainsValue("001"));

Console.WriteLine("是否包含002: {0}", books.ContainsValue("002"));

//此处的索引值是按排序后的顺序

int keyIndex = books.IndexOfKey("zhubajie");

Console.WriteLine("zhubajie的索引值: {0}", keyIndex);

string value = "";

if (books.TryGetValue("tangseng",out value))

{

Console.WriteLine("得到了tangseng的值 : {0}",value);

}

string value2 = "";

if (books.TryGetValue("zhubajie", out value2))

{

Console.WriteLine("得到了zhubajie的值 : {0}", value2);

}

Console.ReadKey();

}

}

}

分析:使用Values和Keys属性访问值和键.如果尝试使用索引器访问一个元素,但所传递的键不存在,就会抛出异常.为了避免一场,可以使用ContainsKey()方法,如果所传递的键存在于集合中,这个方法返回true,也可以调用TryGetValue()方法,该方法尝试获得指定键的值.如果指定键对应的值不存在,该方法就会抛出异常.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 06:30:06

C#高级编程五十二天----有序列表的相关文章

C#高级编程五十五天----HashSet和SortedSet

集 饱含不重复元素的集合称为"集(set)". .NET4包含两个集(HashSet<T>和SortedSet<T>),他们都实现ISet<T>接口.HashSet<T>即包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表. ISet<T>接口提供的方法可以创建合集,交集,或者给出一个集合时另一个集的超集或子集的信息. 案例: //使用HashSet:重复的元素自动被移除,但是不排序 va

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

Lookup类 Dictionary<Tkey,TValue>只为每个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义. Lookup<Tkey,TElement>的方法和属性如下表: 属性名或者方法名 说明 Count 属性Count返回集合中的元素个数 Ite

C#高级编程五十六天----可观察的集合ObservableCollection

可观察的集合 如果需要集合中的元素核实删除或添加的信息,就可以使用ObservableCollection<T>类. ObservableCollection<T>类表示一个动态数据集合,在添加项,移除项或刷新整个列表时,刺激和将提供通知. 命名空间:System.Collections.ObjectModle 语法:public class ObservableCollection<T>:Collection<T>,INotifyCollectionCha

C#高级编程五十三天----字典Dictionary&lt;TKey,TValue&gt;

字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须是唯一的,而值不需要唯一的. 键和值都可以是任意类型(例如:string,int,自定义类型,等等) 通过一个键读取一个值的事件是接近O(1) 键值对之间的偏序可以不定义 使用案例: using System; using System.Collections.Generic; using Syst

C#高级编程五十八天----并行集合

并行集合 对于并行任务,与其相关紧密的就是对一些共享资源,数据结构的并行訪问.常常要做的就是对一些队列进行加锁-解锁,然后运行类似插入,删除等等相互排斥操作. .NET4提供了一些封装好的支持并行操作数据容器,能够降低并行编程的复杂程度. 并行集合的命名空间:System.Collections.Concurrent 并行容器: ConcurrentQueue ConcurrentStack ConcurrentBag: 一个无序的数据结构集,当不考虑顺序时很实用. BlockingCollec

C#高级编程五十九天----集合的性能

各种集合的性能 许多集合类提供了相同的功能,例如,SortedList类与SortedDictionary类的功能几乎完全相同.但是,其性能常常有很大的区别.SortedList集合使用的内存少,SortedDictionary集合的元素检索速度快. 在MSDN文档中,集合的方法常常有性能提示,给出了以大O(字母)表示的操作时间: O(1) O(log n) O(n) O(1)表示无论集合中有多少数据项,这个操作需要的时间都不变.例如ArrayList类的Add()方法就具有O(1)行为.无论列

C#高级编程八十二天----用户自定义异常类

用户自定义异常类 前面已经说了不少关于异常的问题了,现在来给大家说一下自定义异常时咋个回事以及咋样. 为啥会出现自定义异常类呢?用用脚趾头想想也明白,是为了定义咱们自己的异常,自定义异常类继承自ApplicationException 首先异常(Exception)分为两大类,一个是预定义的异常类,后者是用户自定义异常类时需要继承的类. 案例: using System; using System.Collections.Generic; using System.Linq; using Sys

C#高级编程六十二天----LINQ标准的查询操作符

LINQ标准的查询操作符 首先我们来看一下LINQ的操作符,可根据查询操作符的操作"类型"进行分类,如把它们分成投影,限制,排序,联接,分组,串联,聚合,集合,生成,转换,元素,相等,量词,分割等. 类型 操作符名称 投影操作符 Select,SelectMany 限制操作符 Where 排序操作符 OrderBy,OrderByDescending,ThenBy,ThenByDescending,Reverse 联接操作符 Join,GroupJoin 分组操作符 GroupBy 串

C#高级编程七十二天----DynamicObject和ExpandoObject

DynamicObject和ExpandoObject 1.ExpandoObject表示一个对象,该对象包含可在运行时动态添加和移除的成员.这个类和动态类型有关,这个类能做些什么? 案例: //ExpandoObject这个类需要引入System.Dynamic; dynamic dynEO = new ExpandoObject(); dynEO.number = 20; dynEO.Method = new Func<int, string>((int i) => { return