C#之基础3---③(集合,数组与集合的区别,哈希表,哈希函数,C#中的静态方法与非静态方法)

一、概念类

①、什么是数组,什么是集合,为什么要有集合?

数组  int[ ] :最适用于创建和使用固定数量的强类型化对象,创建数组时要明确所创建数组的类型(int[],string[],bool[]...)及数组数量。

集合  ArrayList():把各种类型的数据集合在一起,通过下标来遍历显示。集合是一个类,因此必须在向该集合添加元素之前,声明类的实例,需using System.Collections。

集合的由来:数组中无法随意的放随意类型、随意数量的数据,并且数组创建后无法再向数组里插入数据,数组的使用受局限,为解决以上问题,集合便由此产生。

集合小拓展(方法):

增:Add    移除单独一个数据:Remove   移除指定索引处的值:Removeat    移除批量数据:RemoveRange   插入数据:Insert   插入数组:InsertRange    清空:Clear   排序:Sort   反转:Reverse   找某个元素对应索引:IndexOf    判断是否包含某个元素:Contains   比较:Equals   个数:Count 

②、什么是哈希表,什么是哈希函数,为什么要有哈希表?

哈希表(HashTable):根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快访问记录,一加快查找速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数f(key),对任意给定的关键字值key,带入函数后若能得到包含该关键字的记录在 表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)函数。

哈希表的由来:快速访问数据。

哈希表小拓展:

  1. 哈希表以键值对的形式存值 ,key----键(不能相同),value-----值;
  2. 哈希表使用键作为寻找的方式,是一种无序的结构,无序显示;
  3. 哈希表里的数据如何遍历?不再是for循环了,用foreach循环。但凡是实现了IEnumerable接口的都可以被foreach遍历    ;
  4. 哈希表的方法:判断是否包含这个键Contains,判断是否包含这个值ContainValue,移除remove(移除的是键,值便跟着没了)。

③、C#中静态方法与非静态方法的区别?

C#静态方法是一种特殊的成员方法,它不属于类的某一具体实例,而是属于类本身。所以对于静态方法不需要首先创建一个类的实例,而是采用   类名.静态方法  的格式

(1)static方法是类中的一个成员方法,属于整个类,即不用创建任何对象也可以直接调用。static方法内部只能出现static变量和其他static方法,而且static方法还不能使用this等关键字(this指的是当前的对象),因为它是属于整个类。

(2)静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。

(3)静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。          

(4)C#中的方法有两种:实例方法、静态方法

二、图类

三、代码类

①、集合的声明,添加及遍历

    class Program
    {
        static void Main(string[] args)
        {    
            int[] nums = new int[] { 1, 2, 3, 4, 5 };         //数组声明时要明确数组类型,以及数组内的数据个数
            ArrayList arrayList = new ArrayList();
            arrayList.Add(5);                                 //通过arrayList的add方法,向arrayList 集合中加入各种类型的数据,个数不限
            arrayList.Add("路飞");                            //向集合汇总添加字符串
            arrayList.Add('男');                              //向集合汇总添加字符
            arrayList.Add(52.01);                             //向集合汇总添加double类型
            arrayList.Add(false);                             //向集合汇总添加bool类型
            arrayList.Add(nums);                              //arrayList集合也可以加入数组
            arrayList.Add(new Person("Elsa", '女',18));
            for (int i = 0; i < arrayList.Count ; i++)        //遍历arrayList集合,此处的集合个数用count来表示
            {
                if(arrayList[i] is int[])                     //首先判断集合i中是否有int数组
                {
                    int[] numbers = (int[])arrayList[i];      //如果有:将arrayList[i]强制转换为int[]类型,并声明一个数组承接这个数组的值
                    for (int a = 0; a < numbers.Length ; a++) //遍历nums数组
                    {
                        Console.WriteLine(numbers[a]);        //将遍历出的内容逐个写入到控制台上
                    }
                }
                else if (arrayList[i] is Person)              //判断集合i是否为类
                {
                    ((Person)arrayList[i]).SayPerson();       //如果是则强制转换为Person类,然后调用Person的SayPerson()方法
                }
                else
                {
                    Console.WriteLine(arrayList[i]);         //遍历在控制台上写入集合内容
                }
            }
            Console.ReadKey();         
        }
    }

②、已知集合汇总有1.3.5.7.9,想要显示1-10如何做?

        static void Main(string[] args)
        {
            ArrayList al = new ArrayList();
            al.Add(1);
            al.Add(3);
            al.Add(5);
            al.Add(7);
            al.Add(9);

            for (int i = 1; i <= al.Count ; i+=2)      //在索引为1的地方插入一个值(2),原本索引1处的值自动下移。
            {
                al.Insert(i,i+1);
            } 

            for (int i = 0; i < al.Count; i++)         //遍历集合
            {
                Console.WriteLine(al[i]);              //在控制台上写入集合数据
            }
            Console.ReadKey();
        }

③、集合求平均值,求和

        static void Main(string[] args)
        {
            ArrayList al = new ArrayList();
            for (int i = 1; i <= 100; i++)        //遍历1-100
            {
                al.Add(i);
            }
            int sum = 0;
            for (int i = 0; i < al.Count; i++)
            {
                if(al[i] is int)                 //判断是否可以转换为int 类型,如果可以再强转
                {
                    sum += (int)al[i];          //sum=sum+集合数据,想要对集合数据进行运算,需要强制转换为int类型
                }  
            }
            double avg = sum*1.0 / al.Count;    //运算的值可能会出现小数,所以avg类型为double
            Console.WriteLine("该集合的和为:{0},平均数为:{1}",sum,avg);
            Console.ReadKey();
        }

④、初识哈希表


            static void Main(string[] args)

            Hashtable ht = new Hashtable();                                        //实例化一个哈希表
            int[] num = new int[] { 1, 2, 3, 4, 5 };                               //实例化一个数组
            ht.Add(001, "你好");                                                   //向哈希表中添加数据(键,值)键值类型为object
            ht.Add("路飞", 002);
                                                                                   //ht.Add("路飞", 007);//键不能相同
            ht.Add(new Person("Elsa", '女', 18), 001);
            ht.Add(num, 004);
            ht.Add("索隆", 101);
            ht.Add("105", "乔巴");

            foreach (object item in ht.Keys)                                       //foreach循环,从(keys)头到(keys)尾不间断
            {
                Console.WriteLine("(key)  {0}======(value)  {1}",item,ht[item]);   //item为哈希表中的键,ht[item]为哈希表中的值,item是变量,用来承接key,所以仅仅是一个变量名,item可变为str或其他
            }

            foreach (var item in ht.Values)                                        //foreach循环,哈希表用foreach进行吧遍历,从(values)头到(values)尾,中间不间断
            {
                Console.WriteLine(item);                                           //遍历出来的是哈希表中的值
            }
            Console.WriteLine("添加成功");       
            Console.ReadKey();
        }
    }

⑤、简繁转换

    class Program
    {
        #region 简体字
        private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报";
        #endregion

        #region 繁体字
        private const String Fan= "啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨咹俺按暗岸胺案肮昂盎凹敖熬翱襖傲奧懊澳芭捌扒叭吧笆疤巴拔跋靶紦耙壩霸罷爸苩柏百擺佰敗拜稗斑癍搬扳般頒板蝂扮拌伴瓣半か絆邦幫梆榜膀綁棒磅蚌鎊傍謗苞胞包褒剝薄雹保堡飽寶菢報";
        #endregion
        static void Main(string[] args)
        {
            Hashtable ht = new Hashtable();                //实例化哈希表
            for (int i = 0; i < Jian.Length ; i++)         //遍历简体字和繁体字,把简体字作为key存到哈希表中,把繁体字作为value存到哈希表中。
            {
                ht.Add(Jian[i], Fan[i]);          
            }
            #region 文章
            string text = "海贼王:有个男人他拥有世界上一切财富、名望和权势,他就是「海盗王」高路德•罗杰。在临死前说过这样一句话:让全世界的人都奔向大海「想要我的财宝吗?想要的话全就拿去吧……!";
            #endregion
            for (int i = 0; i < text.Length ; i++)
            {
                if (ht.ContainsKey(text[i]))               //判断哈希表中是否包含文章中的文本
                {
                    Console.Write(ht[text[i]]);            //如果包含则在控制台上写入该文本(键)对应的值
                }
                else
                {
                    Console.Write(text[i]);                //否则,直接写入该文本(键)
                }
            }
            Console.ReadKey();
        }
    }

四、拓展类

①、C#中集中常用集合的用法

http://www.cnblogs.com/sujulin/p/7137938.html

②、C#四种常见集合的区别

https://zhidao.baidu.com/question/716404304978130845.html

③、C#中静态类,静态方法与非静态方法比较

https://www.cnblogs.com/newcapecjmc/p/7064844.html

以上便是第三部分第三讲的内容梳理,下一站走起^_^

猜你喜欢

转载自blog.csdn.net/Elsa15/article/details/86749725
今日推荐