C#入门经典(第6版)阅读笔记(第二篇)(11章集合比较和转换)

目录

第十一章 集合、比较和转换

第十一章 集合、比较和转换
  • 集合:可以使用集合来维护数组,控制对它们对象的访问、搜索和排序等。
  • 比较:在处理对象时常用到它们。这对于集合尤其重要,因为这是排序的实现方式。
  • 转换:定制类型转换,以满足自己的需要。
11.1集合

数组一旦建好,其大小是固定的。
  集合类一般用于处理对象列表,其功能比简单数组要多,功能大多是通过实现System.Collections名称空间中的接口而获得的,因此集合的语法已经标准化了。
  集合的功能(包括基本功能,例如,用【index】语法访问集合中的项)可以通过接口来实现。
System.Collections名称空间中的几个接口提供了基本的集合功能:

  • IEnumerable——可以迭代集合中的项(单词解释:enumerable-adj. 可列举的;可点数的)
  • ICollection——(继承于IEnumerable)可以获取集合中项的个数,并能把项复制到一个简单的数组类型。
  • IList——(继承于IEnumerable和ICollection)提供了集合的项列表,允许访问这些项,并提供其他一些与列表相关的基本功能。
  • IDictionary——(继承于IEnumerable 和IColleciton)类似于IList,但提供了可通过键值(而不是索引)访问的项列表。
11.1.1 使用集合

1-->创建三个类,Animal,Cow,Chicken,Cow:Animal,Chicken:Animal;
Animal.cs

namespace Ch11Ex01
{
    //Define a abstract class Animal
    public abstract class Animal
    {
        //protected ,to access the domain in the class(Animal) or in a class extends the class(Animal) 
        protected string name;
        public string Name  //attention please,the capital of Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        //To define a method
        public Animal()
        {
            name = "The animal with no name";
        }
        //To define a method with parameter
        public Animal(string newName)
        {
            name = newName;
        }
        //To define a method without returned value
        public void Feed()
        {
            Console.WriteLine("{0} has been fed.",name);
        }
    }
}

Cow.cs

namespace Ch11Ex01
{
    //Define a class(Cow)to extend Animal
    class Cow : Animal
    {
        //Define a method to describe animals' actions
        public void Milk()
        {
            Console.WriteLine("{0} has been milked.",name);
        }
        //base关键字指定.NET实例化过程使用基类中具有指定参数的构造函数。
        public Cow(string newName)
            : base(newName)
        { 
        
        }
    }
}

Chicken.cs

namespace Ch11Ex01
{
    public class Chicken : Animal
    {
        //Chicken类中定义了两个方法,一个是自定义,一个是利用base引用基类函数
        public void LayEgg()
        {
            Console.WriteLine("{0} has laid an egg.",name);
        }
        public Chicken(string newName)
            : base(newName)
        {

        }
    }
}

2--->创建主类,Program.cs,类的主函数创建忘了两个对象集合,第一个集合使用System.Array(简单数组),第二个集合是System.Collection.ArrayList类。剩余部分利用了一些ArrayList集合功能超出了Array集合的功能范围。
第一个创建数组

      //第一行:创建一个数组类型,并使用
        //第二行:对Animal进行实例化此处的数组大小要根据内容设定,不然会报错
        //第三行:对Cow实例化,使用带参函数,体现出了面向对象开发的多态性
        //第四行:
        /*分别对数组对象复制,第一个将myCow1(一个对象,经过Cow实例化后得到的返回值) 
         *派生类(Cow)
         *  public Cow(string newName): base(newName){}
         *基类
         *  public Animal(string newName)
         *   {
         *       name = newName;
         *   }
         * 赋值给数组第一个变量
         * 结果:Deirdre
         */
        //第五行:
        /*
         *此处直接获得Chicken里的带一个参数的返回值对象
         * public Chicken(string newName): base(newName){}
         * 结果:Ken
         */
            Console.WriteLine("Create an Array type collection of Animal object and use it:");
            Animal[] animalArray = new Animal[2];
            Cow myCow1 = new Cow("Deirdre");
            animalArray[0] = myCow1;
            animalArray[1] = new Chicken("Ken");
        //第一行:使用迭代循环,并定义了myAnimal类型为Animal类型
        //第二行:输出myAnimal的类型和所带属性
        //第三行:输出animalArray数组长度
        //第四行:调用Animal自带的Feed()函数
        //第五行:调用Chicken里的LayEgg()方法,由于animalArray本来是Animal类型,所以调用Chicken的方法,要进行强制类型转换
         foreach (Animal myAnimal in animalArray)
            {
                Console.WriteLine("New {0} object added to Array collection Name = {1}", myAnimal.ToString(), myAnimal.Name);
            }
            Console.WriteLine("Array collection contains {0} objects.", animalArray.Length);
            animalArray[0].Feed();
            ((Chicken)animalArray[1]).LayEgg();
            Console.WriteLine();

运行结果:


3--->整体

namespace Ch11Ex01
{
    class Program
    {
        static void Main(string[] args)
        {
            //第一行:创建一个数组类型,并使用
            //第二行:对Animal进行实例化此处的数组大小要根据内容设定,不然会报错
            //第三行:对Cow实例化,使用带参函数,体现出了面向对象开发的多态性
            //第四行:
            /*分别对数组对象复制,第一个将myCow1(一个对象,经过Cow实例化后得到的返回值) 
             *派生类(Cow)
             *  public Cow(string newName): base(newName){}
             *基类
             *  public Animal(string newName)
             *   {
             *       name = newName;
             *   }
             * 赋值给数组第一个变量
             * 结果:Deirdre
             */
            //第五行:
            /*
             *此处直接获得Chicken里的带一个参数的返回值对象
             * public Chicken(string newName): base(newName){}
             * 结果:Ken
             */
            Console.WriteLine("Create an Array type collection of Animal object and use it:");
            Animal[] animalArray = new Animal[2];
            Cow myCow1 = new Cow("Deirdre");
            animalArray[0] = myCow1;
            animalArray[1] = new Chicken("Ken");
            //第一行:使用迭代循环,并定义了myAnimal类型为Animal类型
            //第二行:输出myAnimal的类型和所带属性
            //第三行:输出animalArray数组长度
            //第四行:调用Animal自带的Feed()函数
            //第五行:调用Chicken里的LayEgg()方法,由于animalArray本来是Animal类型,所以调用Chicken的方法,要进行强制类型转换
            foreach (Animal myAnimal in animalArray)
            {
                Console.WriteLine("New {0} object added to Array collection Name = {1}", myAnimal.ToString(), myAnimal.Name);
            }
            Console.WriteLine("Array collection contains {0} objects.", animalArray.Length);
            animalArray[0].Feed();
            ((Chicken)animalArray[1]).LayEgg();
            Console.WriteLine();
            //第二个集合是System.Collection.ArrayList类
            Console.WriteLine("Create an ArrayList type collection of Animal objects and use it:");
            ArrayList animalArrayList = new ArrayList();
            Cow myCow2 = new Cow("Hayley");
            animalArrayList.Add(myCow2);
            animalArrayList.Add(new Chicken("Roy"));
            foreach (Animal myAnimal in animalArrayList)
            {
                Console.WriteLine("New {0} object added to ArrayList collection Name = {1}", myAnimal.ToString(), myAnimal.Name);
            }
            Console.WriteLine("ArrayList colleciton contains {0} objects.", animalArrayList.Count);
            ((Animal)animalArrayList[0]).Feed();
            ((Chicken)animalArrayList[1]).LayEgg();
            Console.WriteLine();
            //利用了一些ArrayList集合功能超出了Array集合的功能范围
            Console.WriteLine("Additional manipulation of ArrayList:");
            animalArrayList.RemoveAt(0);
            ((Animal)animalArrayList[0]).Feed();
            animalArrayList.AddRange(animalArray);
            ((Chicken)animalArrayList[2]).LayEgg();
            Console.WriteLine("The animal called{0} is at index {1}.", myCow1.Name, animalArrayList.IndexOf(myCow1));
            myCow1.Name = "Janice";
            Console.WriteLine("The animal is now called {0}.", ((Cow)animalArrayList[1]).Name);



            Console.ReadKey();

        }
    }
}

运行结果:

11.1.2 定义集合

  如何创建自己的强类型化的集合?一种方式是手动实现需要的方法但比较费时间,在某些情况下也非常复杂。我们可以从一个类中派生自己的集合,例如System.Collections.CollectionBase类,这个抽象类提供了集合类的大量实现代码。

11.1.3 索引符

  索引符(indexer)是一种特殊类型的属性,可以把它添加到一个类中,以提供似于数组的访问。

11.2 比较
1.封箱与拆箱

  封箱(boxing)是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。拆箱(unboxing)是相反的转换过程。

  在.net中的通用类型系统(Common Type system,CTS)中,所有类型都是对象(object),都派生自System.Object。
CTS支持两组类型:值类型和引用类型。如果变量是值类型那么这个变量就包含实际的数据。也就是在内存中确实会分配那么一部分空间给这个变量并存储值,引用类型就类似一个类型安全的指针,本身并没有开辟内存空间去存储东西(拆箱装箱之前要先了解這些).

装箱是将值类型转换为引用类型。
拆箱就是将引用类型转换为值类型。
装箱就是把值类型转换成引用类型,反之就是拆箱

int a=5;
string ss=a;装箱
int a2=int.Parse(ss);拆箱

2 . is运算符
此图片可省略,哈哈

  is运算符并不是用来说明对象是某种类型,而是用来检查对象是不是给定类型,或者是否可以转换为给定类型,如果是,这个运算符就返回true。
is 与 as 的比较
is运算符
  is运算符可以检查对象是否与特定的类型兼容。is运算符用来检查对象(变量)是否属于某数据类型(如int、string、bool、double、class等),可在安全类型转换之前进行判断之用。
例如,要检查变量是否与object类型兼容: 注意:“兼容”表示对象是该类型,或者派生于该类型。

int i = 10;   
if (i is object)   
{   
 Console.WriteLine("i is an object");   
}  

int和从object继承而来的其他C#数据类型一样,表达式i is object将得到true,并显示信息。

as运算符
  as运算符用于执行引用类型的显式类型转换。如果要转换的类型与指定的类型兼容,转换就会成功进行;如果类型不兼容,as运算符就会返回值null。如下面的代码所示,如果object引用不指向string实例,把object引用转换为string就会返回null:

object o1 = "Some String";   
object o2 = 5;   
string s1 = o1 as string; //s1 = "Some String"   
string s2 = o2 as string; //s2 = null  

as运算符允许在一步中进行安全的类型转换,不需要先使用is运算符测试类型,再执行 转换

11.3 转换

  这一节讲的就是采用不同的方式进行类型转换,显式,隐式,as的不同方式的使用。





联系方式

个人微信

公众号_DotNet微说.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,504评论 18 399
  • 常会听到身边人发出这样的感慨,才惊奇地发觉,又到了年末,再过几天又将除夕,不知是年龄的增长淡漠了过年,还是生活水平...
    简静如水阅读 312评论 1 2
  • 人为什么活着?今天看了一篇文章,说是人就是为了活着而活着。很多有不凡经历的人,往往不愿意说起自己的过去,因为太过于...
    哲达阅读 710评论 4 7
  • UITableViewCell如果在tableView:cellForRowAtIndexPath:方法中,像其他...
    ForeverYoung21阅读 5,978评论 3 16