读书人

惯用算法帖(C#): 数组

发布时间: 2013-03-25 15:43:04 作者: rapoo

常用算法帖(C#): 数组

C#对数组概念进行了彻底的面向对象化,很大程度上降低了我们对数组结构的使用难度,并且它已经支持了.Net平台的垃圾收集机制。随着C#版本的不断更新,从数组中派生出的新数据结构也日益增加。按照28原理,我们只需要使用其中的20%就能解决80%的问题。但为了做到极致,我们还是需要了解下它们。本文总结到C#(4.0)为止的一些与数组相关的数据结构以及它们的用法。

基本数组
            string[] fruit = new string[5];            string[] vegetable = new string[] { "chinese cabbage", "pepper", "potato", "tomato", "broccoli" };            fruit[0] = "orange";            fruit[1] = "banana";            fruit[2] = "apple";            fruit[3] = "grape";            fruit[4] = "lychee";

多维数组
            string[,] monthplan=new string[30,7];            monthplan[0,0]="A";            monthplan[0, 1] = "B";

锯齿数组
            string[][] foodenum = new string[7][];            foodenum[0] = new string[10];            foodenum[1] = new string[9];            foodenum[2] = new string[8];            foodenum[3] = new string[7];            foodenum[4] = new string[6];            foodenum[5] = new string[5];            foodenum[6] = new string[6];

IEnumerator接口
        public static IEnumerator<string> Yield()        {            yield return "apple";            yield return "orange";            yield return "banana";        }        public static void IEnumeratorTest()        {            var iterator=Yield();            while (iterator.MoveNext())            {                Console.WriteLine(iterator.Current);            }            /*OUT PUT             apple             orange             banana             */        }
数组片断
        public static void ArraySegment()        {            string[] vegetable = new string[] { "chinese cabbage", "pepper", "potato", "tomato", "broccoli" };            // count: get data begin the current index.            ArraySegment<string> arraySegment = new ArraySegment<string>(vegetable,2,2);            for (int i = arraySegment.Offset; i <= arraySegment.Offset + arraySegment.Count; i++)            {                Console.WriteLine(arraySegment.Array[i]);            }            /*             * OUT PUT             * potato               tomato               broccoli             */        }
元组
        public static void Tuples()        {             var tuple=Tuple.Create<string,string,string,string,int,int,int,Tuple<double,double>>("A"                                                                                                 ,"B"                                                                                                 ,"C"                                                                                                 ,"D"                                                                                                 ,1                                                                                                 ,2                                                                                                 ,3                                                                                                 ,Tuple.Create<double,double>(11.1,22.2));            Console.WriteLine(tuple.ToString());            Console.WriteLine(tuple.Item1);            Console.WriteLine(tuple.Item2);            Console.WriteLine(tuple.Item3);            Console.WriteLine(tuple.Item4);            Console.WriteLine(tuple.Item5);            Console.WriteLine(tuple.Item6);            Console.WriteLine(tuple.Item7);            Console.WriteLine(tuple.Rest.Item1.Item1);            Console.WriteLine(tuple.Rest.Item1.Item2);            /*OUT PUT             (A, B, C, D, 1, 2, 3, (11.1, 22.2))            A            B            C            D            1            2            3            11.1            22.2             */        }

协变
        public static void ArrayConvertTest()        {            string[] vegetable = new string[] { "chinese cabbage", "pepper", "potato", "tomato", "broccoli" };            object[] copyVegetable = vegetable;            foreach (object item in copyVegetable)            {                Console.WriteLine(item);            }            /*                OUT PUT                chinese cabbage                pepper                potato                tomato                broccoli             */        }


IStructuralEquatable 和 IEqualityComparer

这两接口可以比较数组中每个元素是否与另外一个数组中的元素中的等值性,IEqualityComparer是比较器,决定元素的比较方式。

    class Person : IEquatable<Person>    {        public string firstName, lastName;        public int age;        public Person(string firstName, string lastName, int age)        {            this.firstName = firstName;            this.lastName = lastName;            this.age = age;        }        public bool Equals(Person other)        {            return this.firstName + this.lastName == other.firstName + other.lastName;        }    }    class PersonEqualComparer : IEqualityComparer    {        public bool Equals(object x, object y)        {            Person p1 = x as Person;            Person p2 = y as Person;            if (null == p1 || null == p2)            {                return false;            }            return p1.firstName == p2.firstName && p1.lastName == p2.lastName && p1.age == p2.age;        }        public int GetHashCode(object obj)        {            throw new NotImplementedException();        }    }        /// <summary>        /// this interface can use to compare value-equalization in two different arraies or tupes.        /// </summary>        public static void IStructuralEquatableTest()        {            Person[] family1 = new Person[]            {                new Person("jim","green",21)                ,new Person("lucy","li",22)                ,new Person ("jack","wang",23)            };            Person[] family2 = new Person[]            {                new Person("jim","green",21)                ,new Person("lucy","li",22)                ,new Person ("jack","wang",22)            };                        if (family1 == family2)            {                Console.WriteLine("it's equal");            }            else            {                Console.WriteLine("it's not equal");            }            if ((family1 as IStructuralEquatable).Equals(family2, EqualityComparer<Person>.Default))            {                Console.WriteLine("it's equal");            }            else            {                Console.WriteLine("it's not equal");            }            if ((family1 as IStructuralEquatable).Equals(family2, new PersonEqualComparer()))            {                Console.WriteLine("it's equal");            }            else            {                Console.WriteLine("it's not equal");            }            /* OUT PUT             * it's not equal             * it's equal             * it's not equal             */        }

Array成员列表
    Name:AsReadOnly Type:MethodName:Resize Type:MethodName:CreateInstance Type:MethodName:CreateInstance Type:MethodName:CreateInstance Type:MethodName:CreateInstance Type:MethodName:CreateInstance Type:MethodName:CreateInstance Type:MethodName:Copy Type:MethodName:Copy Type:MethodName:ConstrainedCopy Type:MethodName:Copy Type:MethodName:Copy Type:MethodName:Clear Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:GetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:SetValue Type:MethodName:get_Length Type:MethodName:get_LongLength Type:MethodName:GetLength Type:MethodName:GetLongLength Type:MethodName:get_Rank Type:MethodName:GetUpperBound Type:MethodName:GetLowerBound Type:MethodName:get_SyncRoot Type:MethodName:get_IsReadOnly Type:MethodName:get_IsFixedSize Type:MethodName:get_IsSynchronized Type:MethodName:Clone Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:BinarySearch Type:MethodName:ConvertAll Type:MethodName:CopyTo Type:MethodName:CopyTo Type:MethodName:Exists Type:MethodName:Find Type:MethodName:FindAll Type:MethodName:FindIndex Type:MethodName:FindIndex Type:MethodName:FindIndex Type:MethodName:FindLast Type:MethodName:FindLastIndex Type:MethodName:FindLastIndex Type:MethodName:FindLastIndex Type:MethodName:ForEach Type:MethodName:GetEnumerator Type:MethodName:IndexOf Type:MethodName:IndexOf Type:MethodName:IndexOf Type:MethodName:IndexOf Type:MethodName:IndexOf Type:MethodName:IndexOf Type:MethodName:LastIndexOf Type:MethodName:LastIndexOf Type:MethodName:LastIndexOf Type:MethodName:LastIndexOf Type:MethodName:LastIndexOf Type:MethodName:LastIndexOf Type:MethodName:Reverse Type:MethodName:Reverse Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:Sort Type:MethodName:TrueForAll Type:MethodName:Initialize Type:MethodName:ToString Type:MethodName:Equals Type:MethodName:GetHashCode Type:MethodName:GetType Type:MethodName:Length Type:PropertyName:LongLength Type:PropertyName:Rank Type:PropertyName:SyncRoot Type:PropertyName:IsReadOnly Type:PropertyName:IsFixedSize Type:PropertyName:IsSynchronized Type:Property


读书人网 >C#

热点推荐