zoukankan      html  css  js  c++  java
  • C#编程(三十三)----------Array类

    Array

    创建数组

    Array intArray1 = Array.CreateInstance(typeof(int), 5);

    for (int i = 0; i < 5; i++)

    {

         intArray1.SetValue(33, i);

    }

    for (int i = 0; i < 5; i++)

    {

         Console.WriteLine(intArray1.GetValue(i));

    }

    Console.ReadKey();

    分析:array类是一个抽象类,所以不能使用构造函数来创建数组(不能使用new).但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组.如果事先不知道元素的类型,该静态方法就非常游泳.因为类型可以作为Type对象传递给CreateInstance()方法.

    还可以将使用Array类创建的数组强制转换成声明为int[]的数组:

    int[] intArray2 = (int[])intArray1;

    CreateInstance()方法有许多重载版本,可以创建多维数组和不基于0的数组:

    using System;

    namespace ConsoleApplication4

    {

        class Program

        {

            static void Main(string[] args)

            {   

                int[] lengths = { 2, 3 };

                int[] lowerBounds = { 1, 10 };

                Array racers = Array.CreateInstance(typeof(Person), lengths, lowerBounds);

                racers.SetValue(new Person("a", "b"), 1, 10);

                racers.SetValue(new Person("c", "d"), 1, 11);

                racers.SetValue(new Person("e", "f"), 1, 12);

                racers.SetValue(new Person("g", "h"), 2, 10);

                racers.SetValue(new Person("i", "j"), 2, 11);

                racers.SetValue(new Person("k", "l"), 2, 12);

                Person[,] racers1 = (Person[,])racers;

                Person first = racers1[1, 10];

            }

        }

        public class Person

        {

            public Person()

            { }

            public Person(string firstName, string lastName)

            {

                this.FirstName = firstName;

                LastName = lastName;

            }

            public string FirstName { get; set; }

            public string LastName { get; set; }

            public override string ToString()

            {

                return String.Format("{0} {1}", FirstName, LastName);

            }

        }

    }

    使用SetValue()方法设置数组的元素,参数是:要设置的值,和当前索引号.

    复制数组

    因为数组是引用类型,所以江数组变量赋予另一个数组变量,就会得到两个引用同一数组的变量.而复制数组,会使数组实现ICloneable接口.这个接口定义的Clone()方法会创建数组的浅表副本.

    如果数组的元素是值类型,:

    如果数组包含引用类型,则不复制元素,而知复制引用.

    除了使用Clone()方法之外,还可以使用Array.Copy()方法创建浅表副本.Clone()方法和Copy()方法有一个重要区别:Clone()方法会创建一个新数组,Copy()方法必须传递阶数相同且有足够元素的已有数组.

    如果需要包含引用类型的数组的深层副本,就必须迭代数组并创建对象.

    排序

    string[] names = {"zhao","qian","sun","li" };

                Array.Sort(names);

                foreach (var item in names)

                {

                    Console.WriteLine(item);

                }

                Console.ReadKey();

    排序后的结果:

    li

    qian

    sun

    zhao

    由此看见,排序是按照字典序排列.

    如果对数组使用自定义类,就必须事先IComparable接口.这个接口定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0.如果该实例应拍在参数对象的前面,该方法就返回小于0的值.如果该实例应排在参数对象的后面,该方法就返回大于0的值.

    案例:

     public class Person:IComparable<Person>

        {

            public Person()

            { }

            public Person(string firstName, string lastName)

            {

                this.FirstName = firstName;

                LastName = lastName;

            }

            public string FirstName { get; set; }

            public string LastName { get; set; }

            public override string ToString()

            {

                return String.Format("{0} {1}", FirstName, LastName);

            }

            public int CompareTo(Person other)

            {

                if (other==null)

                {

                    throw new ArgumentNullException("other");

                }

                int result = this.LastName.CompareTo(other.LastName);

                if (result==0)

                {

                    result = this.FirstName.CompareTo(other.FirstName);

                }

                return result;

            }

        }

    编写测试代码:

    static void Main(string[] args)

            {

                Person[] persons ={

                   new Person{FirstName="shan",LastName="yongxu"},

                   new Person{FirstName="sun",LastName="yanzhao"},

                   new Person{FirstName="zhu",LastName="haitao"},

                   new Person{FirstName="wang",LastName="jiwei"}

                                  };

                Array.Sort(persons);

                foreach (var item in persons)

                {

                    Console.WriteLine(item);

                }

                Console.ReadKey();

            }

    这样是按照名排序,不是按照姓排序.

    如果Person对象的排序方式与上述不同,或者不能修改在数组中用作元素的类,就可以实现IComparer接口或IComparer<T>接口.这两个接口定义了方法Compare().要比较的类必须实现这两个接口之一.ICompare接口的Compare()方法定义了两个要比较的参数的原因.其返回值与IComparable接口的CompareTo()方法类似.

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace ConsoleApplication1

    {

        public enum PersonCompareType

        {

            FirstName,

            LastName

        }

        public class PersonComparer : IComparer<Person>

        {

            private PersonCompareType compareType;

            public PersonComparer(PersonCompareType compareType)

            {

                this.compareType = compareType;

            }

            public int Compare(Person x, Person y)

            {

                if (x==null||y==null)

                {

                    throw new ArgumentNullException("x==y");

                }

                switch (compareType)

                {

                    case PersonCompareType.FirstName:

                        return x.FirstName.CompareTo(y.FirstName);                    

                    case PersonCompareType.LastName:

                        return x.LastName.CompareTo(y.LastName);

                    default:

                        throw new ArgumentNullException("type");

                }

            }

        }

        class Program

        {

            static void Main(string[] args)

            {

                Person[] persons ={

                   new Person{FirstName="shan",LastName="yongxu"},

                   new Person{FirstName="sun",LastName="yanzhao"},

                   new Person{FirstName="zhu",LastName="haitao"},

                   new Person{FirstName="wang",LastName="jiwei"}

                                  };

                Array.Sort(persons,new PersonComparer(PersonCompareType.FirstName));

                foreach (var item in persons)

                {

                    Console.WriteLine(item);

                }

                Console.ReadKey();

            }

        }

        public class Person : IComparable<Person>

        {

            public Person()

            { }

            public Person(string firstName, string lastName)

            {

                this.FirstName = firstName;

                LastName = lastName;

            }

            public string FirstName { get; set; }

            public string LastName { get; set; }

            public override string ToString()

            {

                return String.Format("{0} {1}", FirstName, LastName);

            }

            public int CompareTo(Person other)

            {

                if (other == null)

                {

                    throw new ArgumentNullException("other");

                }

                int result = this.LastName.CompareTo(other.LastName);

                if (result == 0)

                {

                    result = this.FirstName.CompareTo(other.FirstName);

                }

                return result;

            }

        }

    }

    分析:PersonComparer实现了IComparer<Person>接口,可以按照FirstNameLastName对象排序.枚举PersonComparerType定义了可用于PersonComparer的排序选项:FirstNameLastName.排序方式由PersonComparer类的构造函数定义,在该构造函数中设置了一个PersonComparerType.实现Compare()方法时用一个switch语句指定是按照FirstName还是LastName排序.

    这样就可以按照你的需要来排序;是按照姓排序,还是按照名排序?

    Array类还提供了Sort方法,需要将一个委托作为参数,这个参数可以传递给方法,从而比较两个对象,而不需要依赖IComparableIComparer接口.

  • 相关阅读:
    Kaffeine Player:固守丰富的媒体播放器
    GIMP 2.2.15
    基于终真个常用工具
    运用 GNOME Specimen 检查字体
    LINA:让 Linux 使用法度圭表标准在 Windows 和 Mac OS X 上运转
    Openbox 3.4 公布
    DB2 9 运用拓荒(733 查验)认证指南,第 1 局部: 数据库器材与编程步伐(1)
    Wammu-挪动电话治理器
    会计人员必去十大网站(最新)
    判断一个数组的长度用 Length 还是 SizeOf ?
  • 原文地址:https://www.cnblogs.com/android-blogs/p/6598384.html
Copyright © 2011-2022 走看看