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(出队)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

你可以从面试中学到什么?

讲一下我对面试的一些。。。“偏见”,哈哈,熟悉我的同学们一定要批判的读接下来的内容哈。

11900
来自专栏华章科技

穿越十年后看互联网+:家电行业的金矿在哪里?

现在市场上炒得火热的智能家居未来出路在何方?做智能家居的创业者应该注意哪些机会?传统家电厂商又到底如何借助互联网进行转型?本文以智能空调为例,用故事的形式,提前...

8210
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏儿童编程

我不是算命先生,却对占卜有了疑惑——如何论证“占卜前提”的正确与否

事出有因,我对《周易》感兴趣了很多年。只是觉得特别有趣,断断续续学习了一些皮毛。这几天又偶然接触到了《梅花易数》,觉得很是精彩,将五行八卦天干地支都串联了起来。...

14610
来自专栏非著名程序员

这是对付产品经理的一副毒药,程序员慎入

程序员和产品经理的日常就像是一对天生的冤家,为了需求的实现,几乎天天在争吵。这不,就在昨天各大技术和产品群里一个程序员暴打产品经理的视频火了,被广泛传播。

12120
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17830
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

27740
来自专栏儿童编程

一张图理清《梅花易数》梗概

学《易经》的目的不一定是为了卜卦,但是了解卜卦绝对能够让你更好地了解易学。今天用一张思维导图对《梅花易数》的主要内容进行概括,希望能够给学友们提供帮助。

31240
来自专栏儿童编程

儿童创造力教育与编程教育的碰撞——MIT雷斯尼克教授最新理论梗概

儿童编程教育已经在我国各一线二线城市疯狂出现,颇有“烂大街”的趋势。我们不禁要问很多很多问题:

21870
来自专栏非著名程序员

「我真的没有改需求」

11810

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励