澳门新葡亰娱乐网站-www.142net-欢迎您

澳门新葡亰娱乐网站是因为你还没有找到一条正确的致富之路,www.142net是将所有的游戏都汇集在一起的官方平台,因为澳门新葡亰娱乐网站这个网站当中有着大量的游戏攻略,托IP定位技术,传达终端直接到达的精准传播方式。

集合之字典

来源:http://www.bhtsgq.com 作者:计算机知识 人气:89 发布时间:2019-05-18
摘要:字典表示一种复杂的数据结构,这种数据结构允许依据有些键来访问成分。字典也叫做映射或散列表。 C#集聚之字典, 字典表示1种复杂的数据结构,这种数据结构允许依据有个别键来

  字典表示一种复杂的数据结构,这种数据结构允许依据有些键来访问成分。字典也叫做映射或散列表。

C#集聚之字典,

  字典表示1种复杂的数据结构,这种数据结构允许依据有个别键来访问成分。字典也称之为映射或散列表。

  字典的重中之重特征是能依赖键飞快查找值。也得以放肆增多和删除成分,那有一点点像List<T>(

  下图是1个简化表示,键会转交换一下地点贰个散列。利用散列创造贰个数字,它将引得和值关联起来。然后索引包罗3个到值的链接。1个目录项能够提到四个值,索引能够储存为1个树型结构。
  图片 1
  .NET Framework提供了多少个字典类。最要紧的类是Dictionary<TKey,电视机alue>。

一.键的花色

  用作字典中的键的类型必须重写Object类的GetHashCode()方法。只要字典类须要规定因素的岗位,它将要调用GetHashCode()方法。GetHashCode()方法重临的int有字典用于总括在对应地方放置成分的目录。后边介绍这一个算法,将来只供给掌握它涉及素数,所以字典的体量是一个素数。
  GetHashCode()方法的贯彻代码必须满意的渴求:
    *一样的目的应总是回到同样的值
    *不等的目的能够重临同样的值
    *它应实行的可比快,总结的支出相当的小
    *它不能够抛出至极
    *它应至少使用三个实例字段
    *散列代码值应平均布满在int能够积累的这几个数字范围上
    *散列代码最棒在目的的生存期中不产生变化
  字典的本性取决于GetHashCode()方法的兑今世码。

  散列代码值应平均布满在int能够储存的这些数字范围上的开始和结果:

  假如七个键再次回到的散列代码值会获得平等的目录,字典类就亟须寻找近来的可用空闲地点来储存第三个数据项,那必要开始展览自然的追寻,以便以往检索那一项。显著那会下落质量,假设在排序的时候许多键都有雷同的目录这中冲突会更或然出现。遵照Microsoft的算法专门的工作方法,当总括出来的散列代码值平均布满在int.MinValue和int.MaxValue之间时,这种危害会降到最低。

  除了落实GetHashCode()方法之外,键类型还非得落成IEquatable<T>.Equals()方法,或重写Object.Equals()方法。0因为分歧的键对象或者回到相同的散列代码,所以字典使用Equals()方法来比较键。字典检查七个键A和B是还是不是等于,并调用A.Equals(B)方法。那意味必须确认保证下述条件总是创立:

    如果A.Equals(B)再次回到true,则A.GetHashCode()和B.GetHashCode()总是回到同样的散列代码。

  那听上去有个别出人意料,但它很要紧。假使上述条件不创制,那些字典还能够做事,但会师世,把一个对象放在字典中后,就再也查找不到它,恐怕重返了不当的项。

  所以,要是为Equals()方法提供了重写版本,但没提供GetHashCode()方法的重写版本,C#编写翻译器会来得3个警示。

  对于System.Object,这么些原则为true,因为Equals()方法只是相比较引用,GetHashCode()方法其实再次来到3个仅依照对象地址的散列代码。那申明,假如散列表基于三个键,而该键未有重写这一个措施,那几个散列表可以干活,但唯有对象一模一样,键才被感到是分外的。也便是说,把多个对象放在字典中时,必须将它与该键的引用关联起来。也无法从此用同一的值实例化另二个键对象。若是未有重写Equals()方法和GetHashCode()方法,在字典中使用项目时就不太便宜。

  System.String达成了IEquatable接口,相提并论载了GetHashCode()方法。Equals()方法提供了值的比较,GetHashCode()方法根据字符串的值再次回到二个散列代码。因而,在字典中把字符串用在键很有利。

  数字类型(如Int3二)也完毕了IEquatable接口,比量齐观载了GetHashCode()方法。但是这么些项目再次来到的散列代码只好照射到值上。如若指望用作键的数字自己并未有遍及在只怕的整数值范围内,把整数用作键就不能满意键值的平均分布规则,于是不可能得到最好的习性。Int3二并不符合在字典中选用。

  假使急需利用的键类型未有兑现IEquatable接口,并基于存款和储蓄在字典中的键值重载GetHashCode()方法,就足以创立1个落到实处IEqualityComparer<T>接口的相比器。IEqualityComparer<T>接口定义了GetHashCode()方法和Equals()方法,并将传递的靶子作为参数,那样能够提供与对象类型不一致的落到实处方式。

二.示范字典

  创造3个职员和工人ID(EmployeeId)结构,用作字典的键。存款和储蓄在字典中的数据是Employee类型的靶子。

  该组织的成员是代表职员和工人的1个前缀字符和一个数字。这三个变量都以只读的,只万幸构造函数中初始化。字典中的键不应退换,那是必须保障的。    

      public struct EmployeeId : IEquatable<EmployeeId>
          {
            private readonly char prefix;
            private readonly int number;

            public EmployeeId(string id)
            {
              Contract.Requires<ArgumentNullException>(id != null);

              prefix = (id.ToUpper())[0];
              int numLength = id.Length - 1;
              try
              {
                number = int.Parse(id.Substring(1, numLength > 6 ? 6 : numLength));
              }
              catch (FormatException)
              {
                throw new Exception("Invalid EmployeeId format");
              }
            }

            public override string ToString()
            {
              return prefix.ToString()   string.Format("{0,6:000000}", number);
            }

            //由于没有填满整数取值范围,GetHashCode方法将数字向左移动16位,再与原来的数字进行异或操作,
            //最后将结果乘以16进制数0x15051505。这样,散列代码在整数取值区域上的分布就很均匀。
            public override int GetHashCode()
            {
              return (number ^ number << 16) * 0x15051505;
            }

            public bool Equals(EmployeeId other)
            {
              if (other == null) return false;

              return (prefix == other.prefix && number == other.number);
            }
            //比较两个EmployeeId对象的值
            public override bool Equals(object obj)
            {
              return Equals((EmployeeId)obj);
            }

            public static bool operator ==(EmployeeId left, EmployeeId right)
            {
              return left.Equals(right);
            }

            public static bool operator !=(EmployeeId left, EmployeeId right)
            {
              return !(left == right);
            }
          }

          public class Employee
          {
            private string name;
            private decimal salary;
            private readonly EmployeeId id;

            public Employee(EmployeeId id, string name, decimal salary)
            {
              this.id = id;
              this.name = name;
              this.salary = salary;
            }

            public override string ToString()
            {
              return String.Format("{0}: {1, -20} {2:C}",
                    id.ToString(), name, salary);
            }
          }

  客户端代码: 

    static void Main()
        {
            //构造函数指定了31个元素的容量。容量一般是素数。
            //如果指定了一个不是素数的值,Dictionary<TKey,TValue>类会使用指定的整数后面紧接着的一个素数
          var employees = new Dictionary<EmployeeId, Employee>(31);

          var idTony = new EmployeeId("C3755");
          var tony = new Employee(idTony, "Tony Stewart", 379025.00m);
          employees.Add(idTony, tony);
          Console.WriteLine(tony);

          var idCarl = new EmployeeId("F3547");
          var carl = new Employee(idCarl, "Carl Edwards", 403466.00m);
          employees.Add(idCarl, carl);
          Console.WriteLine(carl);

          var idKevin = new EmployeeId("C3386");
          var kevin = new Employee(idKevin, "Kevin Harwick", 415261.00m);
          employees.Add(idKevin, kevin);
          Console.WriteLine(kevin);

          var idMatt = new EmployeeId("F3323");
          var matt = new Employee(idMatt, "Matt Kenseth", 1589390.00m);
          employees[idMatt] = matt;
          Console.WriteLine(matt);

          var idBrad = new EmployeeId("D3234");
          var brad = new Employee(idBrad, "Brad Keselowski", 322295.00m);
          employees[idBrad] = brad;
          Console.WriteLine(brad);
        }

 

3.Lookup类

  Dictionary<TKey,电视alue>类援助各样键关联二个值。Lookup<TKey,TElement>类把键映射到二个值集上。这一个类在程序集System.Core中完结,用System.Linq定义。

  Lookup<TKey,TElement>类无法像相似的字典那样创设,必须调用ToLookup()方法,该方法重返多少个Lookup<TKey,TElement>对象。ToLookup()方法是三个恢弘方法,它可以用于落到实处了IEnumerable<T>接口的全数类。
     ToLookup()方法须要一个Func<TSource,Tkey>,Func<TSource,Tkey>定义了采纳器。 

  

    static void Main()
        {
          var racers = new List<Racer>();
          racers.Add(new Racer(26, "Jacques", "Villeneuve", "Canada", 11));
          racers.Add(new Racer(18, "Alan", "Jones", "Australia", 12));
          racers.Add(new Racer(11, "Jackie", "Stewart", "United Kingdom", 27));
          racers.Add(new Racer(15, "James", "Hunt", "United Kingdom", 10));
          racers.Add(new Racer(5, "Jack", "Brabham", "Australia", 14));
          //国家相同的对象关联到一个键
          var lookupRacers = racers.ToLookup(r => r.Country);

          foreach (Racer r in lookupRacers["Australia"])
          {
            Console.WriteLine(r);
          }

        }

输出:
  Alan Jones
  Jack Brabham

肆.有序字典

  SortedDictionary<TKey,电视alue>类是1个二叉寻觅树,在那之中的成分依照键来排序。该键类型必须完成IComparable<TKey>接口。

  假如键的门类不可能排序,还能创设四个落到实处了IComparer<TKey>接口的相比器,将相比较器用作有序字典的构造函数的1个参数。

  SortedDictionary<TKey,电视机alue>和数年如一列表SortedList<TKey,TValue>(

    *SortedList<TKey,电视alue>类应用的内部存储器比SortedDictionary<TKey,电视机alue>少。

    *SortedDictionary<TKey,电视机alue>成分的插入和删除操作非常的慢。

    *在用已排序好的数目填充集结时,若无需改造体量,ortedList<TKey,电视机alue>很快。

字典表示一种复杂的数据结构,这种数据结构允许根据有个别键来访问成分。字典也称为映射或散列表。 字典的主要性特点是能...

9yue6

  字典的重中之重特点是能依据键火速查找值。也足以轻松增添和删除成分,那有一点点像List<T>(),但未曾在内部存储器中移动继续成分的属性耗费。

集合(Collection

1、群集的效果:

有二种格局得以将对象分组:

1、创造对象数组  贰、制造对象集结

数组的开端化供给求稳住数量,即数组的长短。

汇聚提供1种灵活的拍卖方法。与数组区别,拍卖的目的

集合之字典。组可依据程序改换的急需动态地抓好和减少。 对于一些集

合,您可认为放入该集结的其余对象分配三个“键”,以

便利用该键连忙找出对象。

聚焦是类,因而必须证明新群集后,能力向该集合中

添新币素。

一、创设对象数组

汇聚分为三种等级次序:非泛型会集和泛型会集。

动用非泛型集合的 需引进:System.Collections命名空间。

使用泛型集结需引入:System.Collections.Generic命名空间

(非泛型相比较泛型效用十分低因为要开始展览装箱拆箱操作

图片 2

图片 3

  下图是2个简化表示,键会转交换一下地点一个散列。利用散列创造3个数字,它将引得和值关联起来。然后索引包罗1个到值的链接。多少个索引项能够提到多少个值,索引能够积攒为二个树型结构。

Stack

图片 4

定义:

Stack stack = new Stack();

Stack<int> stackInt = new Stack();

能够重写仓库

publicclass MyStack:Stack{

override

}

Stack类成员介绍

Push()将目的插入Stack的顶端(入栈)推入成分

Pop()移除并赶回Stack最上端的目的(出栈)弹出成分

Peek()重返位于Stack最上端的目的,但不移除

Contains明显某成分是够在Stack中

Clear()从Stack中移除全部目的

Count获取Stack中包蕴的成分

入栈Push

stack.Push();

出栈Pop

intnumber = (int)stack.Pop();

objectobj = stack.Pop ();

Console.WriteLine();

获取栈顶元素Peek

objectobj_1 = stack.Pop();//区别

Console.WriteLine(obj_1);

objectobj_2 = stack.Peek ();

Console.WriteLine(obj_2);

是或不是包涵有个别元素

stack.Contains("1");

转为数组

object[]objs =stack.ToArray();

赢得栈的尺寸

intcount =stack.Count;

for(int i = 0; i < count; i ) {

stack.Pop();

}

  图片 5
  .NET Framework提供了多少个字典类。最重大的类是Dictionary<TKey,TValue>。

队列Queue

Queue成员

一样也落到实处了ICollection和IEnumerable

Enqueue()将对象增多到Queue的结尾处

Dequeue()移除并重回Queue起始处的对象

别的和Stack没有分别

Queue总结

一.先进先出(FIFO)的1种数据结构。

二.乘胜向Queue 中添欧成分,容积通过重新分配按需自行扩展。

可经过调用 TrimToSize 来减弱容积。

三.Queue 接受 null 作为有效值并且同意再一次的成分。

四.在AI寻路算法中常常用的Queue。

入队列

queue.Enqueue("li");

queue_2.Enqueue(1);

出队列

objectobj =queue.Dequeue();

intnumber =queue_2.Dequeue ();

获取队列底部成分

objectobj_1 =queue.Peek();

intnumber_1 =queue_2.Peek ();

Console.WriteLine(obj_1);

Console.WriteLine(number_1);

队列元素个数

queue_2.Count;

queue.Count;

移除多余空间

queue.TrimToSize();

Console.WriteLine(queue.Count);

翻看MSDN演练酒馆,队列中的ToArrayCopyTo

1.键的品类

Dictionary字典

Dictionary(TKey,TValue)类称为字典类

TKey表示键的品种

电视机alue表示字典中的值类型

Dictionary类达成了ICollection、IEnumerable、IDictionary·接口。

字典定义如下:

Dictionary<string,int >dic = new Dictionary<string,int>();

字典中键必须是头一无二的,不是怀有品种都能够是键(一般是string int),

具备类型都能够看做值

图片 6

总结:

字典是贰个泛型会集

TKey必须唯一,Value能够是变量,也得以是目的

例子:

Dictionary dic = new Dictionary();

dic.Add("One",1);//一组键值对

dic.Add("Two",2);

intnumber = dic ["One"];

dic["One"] = 31;

intnumber_2 = dic ["One"];

Console.WriteLine(number);

Console.WriteLine(number_2);

Dictionary strDic = new Dictionary();

strDic["Li"]= "an";//自动Add

strDic["Li"]= "sa";

strDic["Li"] = null;//能够存空对象

Console.WriteLine(strDic.Count);

因而键移除对应的值

strDic.Remove("Li");

Console.WriteLine(strDic.Count);

是否包蕴键/值

if(dic.ContainsKey ("Two")) {

Console.WriteLine("包含Two键");

}

if(dic.ContainsValue(2)) {

Console.WriteLine("包含2值");

}

打字与印刷键值对

foreach(string key in dic.Keys){

Console.WriteLine(key ":" dic[key]);

}

foreach(int value in dic.Values){

Console.WriteLine("value: " value);

}

用户输入11个姓名,能够重新输入同二个姓名,输出各类姓名,并出口各个姓名输入的多少次

Dictionary dicName = new Dictionary();

Console.WriteLine("输入15次姓名");

for(int i = 0; i <= 10; i ) {

stringstr = Console.ReadLine ();

if(dicName.ContainsKey (str)) {

dicName[str] = 1;

}else {

dicName[str] = 1;

}

}

foreach(string name in dicName.Keys) {

Console.WriteLine(name "出现为" dicName[name]);

}

  用作字典中的键的档案的次序必须重写Object类的GetHashCode()方法。只要字典类需求规定因素的地方,它将在调用GetHashCode()方法。GetHashCode()方法重临的int有字典用于计算在对应地点放置成分的目录。前边介绍那么些算法,今后只须要明白它关系素数,所以字典的容积是一个素数。

AarryList

(非泛型相比较泛型成效非常低因为要开始展览装箱拆箱操作

ArrayList是三个非常的数组。透过增添和删除成分,就

能够动态更动数组的长短

ArrayList并不是强类型,ArrayList 或然并不总是提供特定职责的最棒品质。

ArrayList类达成了IList、ICollection和IEnumerable接

口。

图片 7

int[]numbers = {1,23,4,5,11,44};

ArrayList arrayList = new ArrayList (numbers );//默以为二个长短为0的数组

Add添加

arrayList.Add("Wo");

arrayList.AddRange(new int []{9,8,7});

Remove移除

arrayList.Remove(23);//元素

arrayList.RemoveAt(2);//位置

arrayList.RemoveRange(1,二);//从下标一早先数两为博得逆序数组

arrayList.Reverse();//(能够写3个限制的逆序)

八个指标作相比较

arrayList.Equals();

从下标二发端将来截取两位

ArrayListarr = arrayList.GetRange (2, 2);

寻找数组成分下标(在数组中的第三个)

intfirstIndex = arrayList.IndexOf("Wo");

intlastIndex = arrayList.LastIndexOf ("Wo");

安顿成分/数组

arrayList.Insert();

arrayList.InsertRange();

更换成分

arrayList.SetRange(2,new string []{"la","do","bili"});

遍历集结

foreach(object obj in arrayList) {

Console.Write(obj " ");

}

ArrayList总结:

一.扶助电动退换大小的功力。

二.得以灵活的插入成分、删除成分、访问成分。

三.不是强类型,速度跟数组比起来要慢。

周旋于ArraryList来讲,List在大部情形下执行更加好,更安全

设若对类型T只用值类型的话,比较速度得思量装箱开箱的主题材料

  GetHashCode()方法的落到实处代码必须满意的渴求:

List(泛型)

List类表示可透过索引访问的对象的强类型列表。 提供用于对列表进行查找、排序和操作的点子。List是ArrayList类的泛型等效类,该类应用大小可按需动态增添的数组完成IList泛型接口。List类一样也是贯彻了

ICollection、IEnumerable和IList接口。

图片 8

例子:

Listnumbers = new List (new int[]{12,3,44,1,15,2});

排序

numbers.Sort();

foreach(int n in numbers ) {

Console.WriteLine(n);

}

    *一近来后的目的应总是回到同样的值

自学Hashtable和SortedList。

    *差别的指标足以回到一样的值

索引器

(索引器能够重载

图片 9

    *它应实践的可比快,计算的开支非常的小
    *它不可能抛出特别

总结:

一.数据类型是象征将在存取的数组或集结成分的花色。

2.索引器类型表示该索引器使用哪1类型的目录来存取

数组或集结成分,能够是整数,能够是字符串;

this表示操作本对象的数组或会集成员,能够大约把它通晓成索引器的名字,由此索引器无法具备用户定义的名称.

图片 10

图片 11

创办三个索引器,对类里面包车型客车字典进行数量的存取,用来记录学生的真名和分数

图片 12

    *它应至少使用二个实例字段

归纳:

Stack于Queue有怎么着分歧。

Dictionary有何亮点?

ArrayList和List的比较。

    *散列代码值应平均布满在int可以储存的这一个数字范围上

    *散列代码最棒在指标的生存期中不爆发变化

  字典的天性取决于GetHashCode()方法的实当代码。

  散列代码值应平均布满在int能够积累的这几个数字范围上的因由:

本文由澳门新葡亰发布于计算机知识,转载请注明出处:集合之字典

关键词: C# 课堂笔记

最火资讯