数据结构,你还记得吗(中)

2000年6月,微软公司发布了一种新的编程语言C#,主要由安德斯·海尔斯伯格(Anders Hejlsberg)主持开发,它是第一个面向组件的编程语言,其源码会编译成msil(中间语言)再运行。
  C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
  接下来,我会介绍C#的数据结构。

跟上一篇《数据结构,你还记得吗(上)》目录进行一一对应讲解C#中各种数据结构,以此来提升大家的理解。

数组

同一类型和不同类型的多个对象

  • 同一类型多个对象

    • 可以使用集合和数组管理。
    • C#用特殊的记号声明、初始化和使用数组。
    • Array类在后台发挥作用,它为数组中元素的排序和过滤提供了几个方法。
    • 使用枚举器,可以迭代数组中的所有元素。
  • 不同类型多个对象
    • 可以使用Tuple(元组)类型管理。

数组类型

  • 一维数组
  • 多维数组
  • 锯齿数组
        多维数组,行和列是固定的:
        int[][] arrMore=new int[3][6];

        锯齿数组只要在第一个方括号设置行数,每行的个数是可变的。
        int[][] jagged=new int[3][];
        jagged[0]=new int[2]{1,2};
        jagged[1]=new int[6]{1,2,3,4,5,6};
        jagged[2]=new int[3]{1,2,3};

Array

Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义(System.Array)。Array 类提供了各种用于数组的属性和方法。
用方括号声明数组是C#中使用Array类的表示法。在后台使用C#语法,会创建一个派生自抽象基类Array的新类。这样,就可以使用Array类为每个C#数组定义的方法和属性了。

创建数组

??Array类是一个抽象类,所以不能使用构造函数来创建数组。但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组。如果事先不知道元素的类型,该静态方法就非常有用,因为类型可以作为Type对象传递给CreateInstance()方法。

例如:
  Array arr=Array.CeateInstance(typeof(int),5);
  for(int i=0;i<5;i++)
   {
     arr.SetVaule(i,i);
   }
  for(int i=0;i<5;i++)
   {
     int  vaule=arr.getVaule(i);
   }

羽毛球筒

Stack

??堆栈(Stack)代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。

  • 栈以及泛型栈 
public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable

public class Stack : ICollection, IEnumerable, ICloneable
属性 描述
Count 获取 Stack 中包含的元素个数
方法 描述
Pop public virtual object Pop();移除并返回在 Stack 的顶部的对象
push public virtual void Push(object obj);向 Stack 的顶部添加一个对象
peek public virtual object Peek();返回在 Stack 的顶部的对象,但不移除它
ToArray public virtual object[] ToArray();创建数组并将堆栈元素复制到其中
Contains public virtual bool Contains(object obj);判断一个元素是否在栈中
Clear public virtual void Clear();从 Stack 中移除所有的元素。

队列

水管子

Queue

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。

  • 队列以及泛型队列
public class Queue : ICollection, IEnumerable, ICloneable

public class Queue<T> : IEnumerable<T>, IEnumerable, IReadOnlyCollection<T>, ICollection
属性 描述
Count 获取 Queue 中包含的元素个数
方法 描述
Clear public virtual void Clear(); 从 Queue 中移除所有的元素。
Contains public virtual bool Contains( object obj ); 判断某个元素是否在 Queue 中。
Dequeue public virtual object Dequeue();移除并返回在 Queue 的开头的对象。
Enqueue public virtual void Enqueue( object obj ); 向 Queue 的末尾添加一个对象。
ToArray public virtual object[] ToArray();复制 Queue 到一个新的数组中。
TrimToSize public virtual void TrimToSize();设置容量为 Queue 中元素的实际个数。

链表

单链表

  • 啥是单链表?
    ?单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这组存储单元既可以是连续的,也可以是不连续的。
    ?链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
  • 链表的结点结构
    ┌───┬───┐
    │data│next │
    └───┴───┘
     data域--存放结点值的数据域[元素]
     next域--存放结点的直接后继的地址(位置)的指针域(链域)[指针]
实现方式
public class Node<T>
{
    public T Data { set; get; }          //数据域,当前结点数据
    public Node<T> Next { set; get; }    //位置域,下一个结点地址

    public Node(T item)
    {
        this.Data = item;
        this.Next = null;
    }

    public Node()
    {
        this.Data = default(T);
        this.Next = null;
    }
}

请转到《数据结构:单链表》查看更详细内容!

双向链表

??LinkedList是一个双向链表,其元素会指向它前面和后面的元素。这样,通过移动到下一个元素可以正向遍历链表,通过移动到前一个元素可以反向遍历链表。

链表在存储元素时,不仅要存储元素的值,还必须存储每个元素的下一个元素和上一个元素的信息。这就是LinkedList包含LinkedListNode类型的元素的原因。使用LinkedListNode,可以获得列表中的下一个和上一个元素。LinkedListNode定义了属性List,Next,Previous和Value。List属性返回与节点相关的LinkedList对象。Next和Previous属性用于遍历链表,访问当前节点之后和之前的节点。Value属性返回与节点相关的元素,其类型是T。
  链表的优点是,如果将元素插入到列表的中间位置,使用链表就会很快。在插入一个元素时,只需要修改上一个元素的Next引用和下一个元素的Previous引用,使它们引用所插入的元素。在List中,插入一个元素,需要移动该元素后面的所以元素。
  链表的缺点是,链表元素只能一个接一个的访问,这需要较长时间来查找位于链表中间或尾部的元素。
LinkedList类定义的成员可以访问链表中的第一个和最后一个元素(First和Last);
  在指定位置插入元素:AddAfter(),AddFirst()和AddLast();
  删除指定位置的元素:Remove(),RemoveFirst(),RemoveLast();
  搜索:Find(),FindLast()。


菜单树

C#中没有实现树的具体类,一般可以通过自己实现。
结点树包含:父结点(根结点的父结点为null)、子结点(List集合)、数据对象。

请转到《 数据结构:树》查看更详细的内容!


??图状结构简称图,是另一种非线性结构,它比树形结构更复杂。树形结构中的结点是一对多的关系,结点间具有明显的层次和分支关系。每一层的结点可以和下一层的多个结点相关,但只能和上一层的一个结点相关。而图中的顶点(把图中的数据元素称为顶点)是多对多的关系,即顶点间的关系是任意的,图中任意两个顶点之间都可能相关。也就是说,图的顶点之间无明显的层次关系,这种关系在现实世界中大量存在。因此,图的应用相当广泛,在自然科学、社会科学和人文科学等许多领域都有着非常广泛的应用。

c#没有实现图的数据结构,但是可以自己实现,参考如下
请转到《数据结构:图》查看更详细内容!


字典树

c#也没有实现字典树,可以自己实现,参考如下

请转到《数据结构:字典树》查看更详细内容!


散列表(哈希表)

哈希表(HashTable)简述

??Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.

什么情况下使用哈希表

  • 某些数据会被高频率查询
  • 数据量大
  • 查询字段包含字符串类型
  • 数据类型不唯一

使用方法

  • 哈希表需要使用的namespace
using System.Collections;
using System.Collections.Generic;
  • 哈希表的基本操作:
//添加一个keyvalue键值对:
HashtableObject.Add(key,value);

//移除某个keyvalue键值对:
HashtableObject.Remove(key);

//移除所有元素:
HashtableObject.Clear(); 

// 判断是否包含特定键key:
HashtableObject.Contains(key);
  • 遍历哈希表
 遍历哈希表需要用到DictionaryEntry Object,代码如下:
for(DictionaryEntry de in ht) //ht为一个Hashtable实例
{
   Console.WriteLine(de.Key);  //de.Key对应于keyvalue键值对key
   Console.WriteLine(de.Value);  //de.Key对应于keyvalue键值对value
}

请转到《数据结构:哈希表》查看更详细内容!


总结

综上所述,找了相关的文档之后,发现C#本身没有封装部分数据结构,可能是让大家自己发挥,也可能跟它当初设计的原因有关,因为它不是专们为处理数据而诞生的。真的又是写了一篇小白文,发现写到这里还不够,于是将标题改为《数据结构,你还记得吗(中)》,接下来还要继续《数据结构,你还记得吗(下)》 未完待续!

其他系列的C#数据结构参考《C# 数据结构

原文地址:https://www.cnblogs.com/zhan520g/p/10218104.html

时间: 2024-10-11 12:00:41

数据结构,你还记得吗(中)的相关文章

数据结构,你还记得吗(下)

有了前面两篇博文做积淀,这篇博文该干啥呢,该玩一玩Code了.以下跟第一篇的面试题对应,如果问到你,你该怎么做呢? 跟上一篇<数据结构,你还记得吗(中)>目录进行一一对应,以此来提升理解. 数组 数组反转 int[] arr = { 1, 2, 3, 5, 6 }; int length = arr.Length / 2; for(int i=0;i<length; i++) { int temp = arr[i]; arr[i] = arr[arr.Length - i-1]; arr

谈谈asp.net MVC中的AppendTrailingSlash以及LowercaseUrls ,你还记得吗?

asp.net MVC是一个具有极大扩展性的框架,可以在从Url请求开始直到最终的html的渲染之间进行扩展,所以要学好还是需要了解框架的运行原理,推荐Artech. 今天我们回忆的不是MVC中的filter,也不是Controller的激活或者是Action的执行,或者是Url路由RouteData的生成,我们来回忆的是RouteTable.Routes  ,即全局路由表的两个属性.AppendTrailingSlash以及LowercaseUrls. AppendTrailingSlash的

还记得面试时被算法支配的恐惧吗?

还记得面试时被算法支配的恐惧吗? <font size = '5'>?<center>面试造火箭,上班拧螺丝</center> </font> 大多数程序员心里会想"总结的真精辟",当面试到算法时,各种"跪"."再跪"."还是跪"......,多少人因为算法而拿不到心仪的offer,算法毁一生啊. 智力面试时代 现在算法已经成为大厂面试的重中之重,甚至一些国外的大厂只面试算法,为

还记得早起偷菜!朋友圈晒步?蓝鲸游戏背后的极端强迫症

据媒体报道,为期50天.以"做任务"形式诱导参与者完成各类自残行为甚至自杀的死亡游戏"蓝鲸"近期已传入国内社交平台,到5月末,已有极少数少年深陷游戏中,不能自拔.更有一些无良之人,开始借青少年对"蓝鲸"游戏的好奇心行诈骗之实.比如,借"带人进蓝鲸游戏真群"之名骗取女性用户裸照,随即以"不给钱就公开裸照"等威胁手段向女性用户索要钱财. 文/张书乐 人民网.人民邮电报专栏作者,著有<微博运营完全自学手册&

c#静态构造函数 与 构造函数 你是否还记得?

构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数. 静态构造函数有哪些特点呢: 静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的. 静态构造函数没有参数,因为框架不可能知道我们需要在函

《C#编程风格》还记得多少

<C#编程风格>还记得多少 开始实习之后,才发现自己是多么地菜.还有好多东西还要去学习. 公司很好,还可以帮你买书.有一天随口问了一下上司D,代码规范上面有什么要求.然后D在Amazon上面找到了这本书<C#编程风格(The Elements of C# Style)>(中英对照),让我直接买下开看,按上面的要求编写就可以了.书可以找秘书F去报销. 上个星期四在Amazon下单,周一才到.这书确实来的有点慢,没关系,我看的快.从周一到周五,用每天上下班在挤地铁(广州地铁你懂的)的时

还记得那种 喜欢到不行的感觉么?

今天 , 听人说 . 那种喜欢到不行的 感觉 .突然感到好心酸 .喜欢到不行的那种感觉是什么 ,就是可以为了他 不给自己留余地 . 不会再让别人进入到自己的心里.有种冲动 想好好跟他在一起, 甚至一生一世 .当然, 一生一世这种事情 谁也说不准 ,但是 至少那一刻是认真的 . 没有一点欺骗 .如今的爱情都是有模式的,今儿认识了,互相觉得人还不错,例如性格够正常,都长得还行,比如个头儿符合我的标准,还有家也是一个地方的,以后不用嫁的很远.工作稳定,年龄相当.不是悸动,不是心动,更没心跳加速,只是觉

Java 8?还记得那年大明湖畔的Java 7吗?

译注:但见新人笑,哪闻旧人哭.在大家都在兴致勃勃的讨论Java 8的时候,那个早被遗忘的Java 7,或许你从来都没有记得它的好. Java 8的发布也有一个月了,我相信现在大家都在探索JDK 8中的新特性.但是,在你彻底开始钻研Java 8之前,最好先来回顾下Java 7有哪些新特性.如果你还记得的话,Java 6是没有增加任何特性的,只是JVM的一些改动以及性能的提升,不过JDK 7倒是增加了不少有助于提升开发效率的很给力的特性.我现在写这篇文章的目的是什么呢?为什么别人都在讨论Java 8

推荐一些socket工具,TCP、UDP调试、抓包工具. 还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用。好工具

还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有一天,你写"传统"的PHP有些累了,想玩玩socket了,搞搞python.NodeJS.GO之类的新兴语言或框架(当然我不是说这些语言不能写web),或者干脆就用PHP吧,事实上PHP5.4的性能提高的真是相当之多,用PHP 的socket函数就能简单的写一个web socket服务器