第11章 集合,比较和转换

.集合

集合类一般用户处理对象列表,其功能比简单数组要多,功能大多是通过实现System.Collections命名空间的接口获得。数组是该命名空间中System.Array类的实例,它只是集合类的一个类型。

 

简单数组

ArrayList

类名

System.Array

System.Collection.ArrayList

特点

引用类型,需要初始化大小,并逐项赋值

大小可变,无需初始化大小

定义

Animal [] animalArray=new Animal[2]

ArrayList animalArrayList=new ArrayList();

赋值

animalArray[0]=new Chicken("ken");

animalArrayList.Add(new Chicken("Roy"));

统计大小

animalArray.Length()

animalArrayList.Count;

数据类型

数组的类型是Animal,可以直接使用

无数据类型,需强制转换成Aniaml

 

ArrayList的其他方法有:

  Remove(myCow2):删除myCow2对象

  RemoveAt(0):删除第一个对象

  AddRange(animalArray):把数组animalArray中的对象添加到集合中

  IndexOf(myCow2):myCow2的索引值

 

1.定义集合

  定义集合可以从一个类中派生自己需要的集合,如System.Collections.CollectionBase

2.索引符

   为实现类似于数组的访问,需用集合的索引符属性

3.迭代器

   集合类可以使用foreach循环访问集合的内容,也可以用foreach循环访问定制类的内容,最简单的方式是用迭代器。具体实现方式为:

   1).使用yield关键字选择要在foreach循环中使用的值:

           yield return value;

   2).如果要迭代一个类,用接口类型 Ienumerator,使用方法GetEnumerator(),其返回类型是Ienumerator

 3).要迭代一个类成员,如使用一个方法,则使用接口IEnumerable

.比较

对象之间的比较有两类:

  1).类型比较:确定对象是什么,或者对象继承了什么

  2).值比较:在比较对象的值时,必须从一开始就定义比较的含义

1.类型比较

   类型比较的方法有:

    1).myObj.GetType== typeof(MyComplexClass)方法

    2).is运算符

1).封箱和拆箱

    1>.封箱(boxing):把值类型转换为System.Ojbec类型,或转换为由值类型实现的接口类型。如:

        eg1:  struct MyStruct

                {

                     public int Val;

                }

              //封箱

                 MyStruct valTypel=new MyStruct();

     valTypel.Val=5;

     object refType=valTypel;

   注:以上述方式封箱,refType包含值类型变量的一个副本的引用,而不包含源值类型变量的引用。修改原值不影响refType内封装的内容

          eg2:把值类型封装到一个接口类型中

                  interface IMyInterface 

                   {

                   }

                  struct MyStruct: IMyInterface

                   {

                         public int Val;

                   }

                   //封箱

                  MyStruct valType1=newMyStruct();

                  IMyInterface   refType=valType1;

                   //拆箱

                      MyStruct  ValType2=(MyStruct)refType;

        2>.拆箱(unboxing)boxing的逆向操作,即把转换后的变量强制类型转换成值类型所在的类型

2).is运算符

    功能:检查对象是否是给定类型,或者是否可以转换为给定类型,如果是则返回true

    语法:<operand> is <type>

    表达式结果:

         1>.如果<tpye>是一个类类型,而<operand>也是一个类类型,或者它继承了该类型,或者它可以封箱到该类型中,则结果为ture.

         2>.如果<type>是一个接口类型,而<operand>也是该类型,或者它是实现该接口的类型,则结果为true.

         3>.如果<type>是一个值类型,而<operand>也是该类型,或者它可以拆箱到该类型中,则结果为true.    

2.值比较

  1).运算符重载

      语法:给类添加运算符类型成员(必须为static),一般操作数的类型与运算符的类型相同。也可以使用混合类型,但注意不要把相同签名的运算符添加到多个类中。并且重载的参数类型和顺序也要正确。

       eg:常在如下类型的 + 方法

              public class AddClass1

              {

                    public int val;

                    //重载 +运算符

                    public static AddClass1   operator + (AddClass1 op1,AddClass1 op2)

                    {

                           AddClass1     returnVal=new AddClass1();

                           returnVal.val=op1.val+op2.val;

                           return returnVal;

                    }

              }

 

           上述重载后即可被使用,如下:

                  AddClass1 op1=newAddClass1();

                  opt1.val=5;

                  AddClass1 op2=newAddClass1();

                  opt2.val=6;

                  AddClass1 op3=opt1+opt2;

          

 

           可以重载的运算符有:

             >.一元运算符:+-,!,~++--true,false

    >.二元运算符:+-*/,%&|^,<<,>>

    >.比较运算符:==,!=<,>,<=,>=

     注:<>必须成对重载

  2).使用IComparableIComparer接口

 1>.Icomparable在要比较的对象的类中实现,可以比较当前对象与另一个对象

         IComparable提供一个方法CompareTo(),该方法接受一个对象,返回一个int

    2>.IComparer在一个单独的类中实现,用于比较任意两个对象

         IComparer提供一个方法Comparer(),这个方法接受两个对象,返回一个int

.转换

    1.重载转换运算符

        用关键字implicitexplicit来指定转换

    2.as运算符

       语法:<operand> as <type>

        注意:<operand>的类型可能是<type>,<operand>可以隐式转换为<type>,或者<operand>可以封箱到<type>类型中



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值