C#基础与常用数据结构学习笔记

1.接口 interface

  接口相当于没有方法实现的抽象类,接口方法不要加各种访问级别:例如public,private等。

跟随者杨老大,写了如下代码:

  public interface Flyable
    {
        void fly();
    }

public interface Runable
    {
        void run();
    }

public class Bird:Flyable,Runable
    {
        #region Flyable 成员

public void fly()
        {
            Console.WriteLine("Little Bird is Flying.");
        }

#endregion

#region Runable 成员

public void run()
        {
            Console.WriteLine("Little Bird is Running.");
        }

#endregion
    }

2.常用系统接口

  using,实现了IDisposable接口的对象可以使用using进行资源声明,出了using的作用域以后自动调用Dispose方法。 Dispose和Close的区别:实现了IDisposable接口必须定义Dispose方法,但不一定有Close方法,很多Dispose的实现都是调用Close方法。SqlConnection Close以后还能重新Open,但是Dispose以后就不能再用。

用using最多的就是再与非托管代码的交道中,例如using(SqlConnection con=new SqlConnection()){ XXXXXXXX },省去了释放资源的代码,简洁了开发工作。
  foreach:实现了IEnumerable接口的对象都可以使用foreach进行遍历。申明一个对象,并查看IEnumerable的定义,发现其有一个属性接口和两个方法接口,Current,MoveNext等。

3.列表ArrayList

  ArrayList可以看做是动态的数组。Add、Clear、Contains、Count、Remove、RemoveAt、ToArray(转换,再没关系)、索引器
C#中所有的数组类型int[]、string[]等都是继承自Array类。

这里跟随杨老大做了一个小题目,我知道这是他去Microsoft面试的一道小题目(看过杨老大《我的微软面试经历》的人都知道),就是一个奇偶分家的题目:有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。比如‘2 7 8 3 22 9’显示成‘7 3 9 2 8 22’。

  最普通的解法:

    #region ArrayList奇偶分家
            int[] nums = { 3, 8, 11, 30, 55, 22 };
            ArrayList list = new ArrayList();
            foreach(int i in nums)
            {
                if(i%2==1)//奇数
                {
                    list.Add(i);
                }
            }
            foreach(int j in nums)
            {
                if(j%2==0)//偶数
                {
                    list.Add(j);
                }
            }
            foreach(int i in list)
            {
                Console.Write(i+",");
            }

#endregion

  当然,ArrayList还有许多美中不足的地方:数据放进去就不知道是什么类型的了;不能防止非法类型数据的放入;将ArrayList返回给其他函数,会令调用者很困惑。要区分变量、返回值类型和实际对象类型的区别。IntArrayList,StringArrayList又没完没了。因此,就出现了泛型List列表。

    这里,跟随老大了解了集合,ArrayList、HashSet、Hashtable、Dictionary等都可以叫做集合类。实现了IEnumerable(getEnumerator())、IEnumerable<T>的接口都可以使用foreach进行遍历。

4.泛型 List/Dictionary

  List<T>。List<T> 除此之外并无不同,<T>表示List中放的数据类型是T类型的,因为有声明类型时的约定,因此所有方法的参数、返回值都是确定类型的了。所有的List<T>所有的方法也都是泛型的,范型的集合提供的方法更多,Max、Min、Sort等。

Dictionary:Key-value Pair 键值对。成语不可以重复,但是解释可以重复。

  Dictionary<K,V>:(1)Add:添加,如果重复,则报错索引器方式设置值:可以重复设置,即使不存在也没关系,如果重复则新数据覆盖旧数据(2)ContainsKey,判断是否存在这个Key

这里老大谈到了一道常考题:泛型的非泛型类型是什么?例如Dictionary<K,V>的非泛型对应的是Hashtable;List<T>→ArrayList

  至于Dictionary为何这么快?因为Dictionary中有一个存储键值对的区域,采用一个固定算法(散列算法,非常快,可以认为时间复杂度为O(1) )根据key来计算这个kvp存放的地址,计算key的值的键值对应该存储的地址,将键值对放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了。根据key找房间号,而不是逐个房间找。

5.其他集合类

  HashSet<T>:不能盛放重复的数据,重复的数据只保留一份。Add(T value)添加元素;Contains(T value)判断是否存在元素,HashSet使用了和Dictionary类似的算法,因此Contains方法效率非常高,时间复杂度为O(1)。

  讲到这里,老杨又给出了一道面试题:现有1~10共10个整数,已随机放入一个有8个元素的数组a[8]。要求找出没有被放入数组的那2个数。注意:程序不用实现自然数随机放入数组的过程,测试数据{9,8,5,3,1,10,2,7}。

  于是,又用最淳朴无算法的代码实现:

    #region 07.面试题
            int[] nums = { 9, 8, 5, 3, 1, 10, 2, 7 };
            HashSet<int> set = new HashSet<int>();
            foreach (int i in nums)
            {
                set.Add(i);
            }
            for (int i = 1; i <= 10; i++)
            {
                if (!set.Contains(i))
                {
                    Console.WriteLine(i);
                }
            } 
            #endregion  

  Stack<T>,栈,先入后出,Push(压栈)、Pop(出栈)。
  Queue<T>,队列,先入先出:Enqueue(入队)、Dequeue(出队)

时间: 2024-08-25 00:12:37

C#基础与常用数据结构学习笔记的相关文章

小猪的数据结构学习笔记(四)

小猪的数据结构学习笔记(四) 线性表之静态链表 --转载请注明出处:coder-pig 本章引言: 在二,三中中我们分别学习了顺序表中的线性表与单链表,线性表有点类似于 我们前面所学的数组,而单链表使用的最多的是指针,这里问个简单的问题, 如果是在以前没有指针的话,前辈先人们怎么实现单链表呢?大家思考下! 没有指针,那么用什么来代替呢?前辈先人们非常机智,想出了使用下标+游标的方式 来实现单链表的效果!也就是今天要讲的--静态链表! 当然你也可以直接跳过本章,因为有了单链表就没有必要用静态链表了

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

小猪的数据结构学习笔记(五)

小猪的数据结构学习笔记(五) 线性表之--循环链表                           --转载请注明出处:coder-pig 循环链表知识点归纳: 相关代码实现: ①判断是否为空表: ②单循环链表的存储结构 其实和单链表的结构是一样的! /*定义循环链表的存储结构*/ typedef struct Cir_List { int data; struct Cir_List *next; }Lnode; ③初始化循环单链表 代码如下: //1.循环链表的初始化 //表示一个元素,如

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

数据结构学习笔记(1)-数据结构与算法

基本概念和术语 1.数据  数据元素  数据对象   数据结构 数据:在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象:是性质相同的数据元素的集合.是数据的一个子集. 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 2.数据结构 数据结构分为逻辑结构和物理结构 2.1逻辑结构 逻辑结构表示数据之间的相互关系.通常有四种基本结构: 集合:结构中的数据元素除了同属于一种类型外,别

【数据结构学习笔记(C#描述)】(二)算法分析

由上一章的内容可知软件质量的重要特征之一就是能够高效的利用资源(运行效率),因此我们就要考虑如何创建出能够高效利用CPU及内存的数据结构与算法.而算法分析的目的就是为了让我们能够认识到算法对于资源的利用效率. 我们要想分析算法的效率,就需要找到一个评价算法效率的标准及方法. 一般我们如果能快速的利用CPU就会更好的节省时间,因此在时间层面上我们的评价标准就是时间复杂度,而如果我们能够较好的利用内存的话我们将会节省更多的内存空间,因此在空间层面上我们的评价标准就是空间复杂度. 所谓时间复杂度和空间

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

数据结构学习笔记——绪论

数据结构学习笔记——绪论 为了更贴切的描述一种数据结构,通常采用二元组表示:(对于一种数据结构其逻辑结构唯一) B=(D,R)其中,B是一种数据结构,它由数据元素的集合D和D上二元关系的集合R所组成.即D={ di | 1 <= i<= n, n > 0}R={ rj | 1 <= j<= n, n > 0}D 上的一个关系r是序偶的集合,对于r中任一序偶<x,y>(x,y属于集合D),把x叫做偶序第一节点,把y叫做偶序第二结点,又称序偶的第 一结点为第二结

蓝鸥Unity开发基础—— 二维数组学习笔记

蓝鸥Unity开发基础-- 二维数组学习笔记 一.二维数组 有两个下标的数组叫做二维数组 类似[,]数组名=new类型[常量表达式1,常量表达式2] int[,] numbers= new int[2,3]; [0,0] [0,1] [0,2] [1,0] [1,1] [1,2] 举例说明 using System; namespace Lesson16{    class MainClass    {        public static void Main (string[] args)