常用算法帖(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
             */
        }
BitArray
 public static void TestBitArray()
        {
            BitArray myBitArray = new BitArray(8);// set the length of the array
            myBitArray.Set(0, true);//current value 10000000
            myBitArray.Set(7, true);//current value 00000001
            DisplayBit(myBitArray);

            BitArray myBitArray2 = new BitArray(8);
            myBitArray2.Set(0, true);//current vlaue 10000000
            myBitArray2.Set(1, true);//current value 11000000
            DisplayBit(myBitArray2);

            Console.WriteLine("Not");
            myBitArray.Not();
            DisplayBit(myBitArray);

            Console.WriteLine("And");
            myBitArray.And(myBitArray2);
            DisplayBit(myBitArray);


            Console.WriteLine("Xor");
            myBitArray.Xor(myBitArray2);
            DisplayBit(myBitArray);

            /*OUT PUT
                10000001
                11000000
                Not
                01111110
                And
                01000000
                Xor
                10000000

             */

        }


Array成员列表
  1. Name:AsReadOnly Type:Method
  2. Name:Resize Type:Method
  3. Name:CreateInstance Type:Method
  4. Name:CreateInstance Type:Method
  5. Name:CreateInstance Type:Method
  6. Name:CreateInstance Type:Method
  7. Name:CreateInstance Type:Method
  8. Name:CreateInstance Type:Method
  9. Name:Copy Type:Method
  10. Name:Copy Type:Method
  11. Name:ConstrainedCopy Type:Method
  12. Name:Copy Type:Method
  13. Name:Copy Type:Method
  14. Name:Clear Type:Method
  15. Name:GetValue Type:Method
  16. Name:GetValue Type:Method
  17. Name:GetValue Type:Method
  18. Name:GetValue Type:Method
  19. Name:GetValue Type:Method
  20. Name:GetValue Type:Method
  21. Name:GetValue Type:Method
  22. Name:GetValue Type:Method
  23. Name:SetValue Type:Method
  24. Name:SetValue Type:Method
  25. Name:SetValue Type:Method
  26. Name:SetValue Type:Method
  27. Name:SetValue Type:Method
  28. Name:SetValue Type:Method
  29. Name:SetValue Type:Method
  30. Name:SetValue Type:Method
  31. Name:get_Length Type:Method
  32. Name:get_LongLength Type:Method
  33. Name:GetLength Type:Method
  34. Name:GetLongLength Type:Method
  35. Name:get_Rank Type:Method
  36. Name:GetUpperBound Type:Method
  37. Name:GetLowerBound Type:Method
  38. Name:get_SyncRoot Type:Method
  39. Name:get_IsReadOnly Type:Method
  40. Name:get_IsFixedSize Type:Method
  41. Name:get_IsSynchronized Type:Method
  42. Name:Clone Type:Method
  43. Name:BinarySearch Type:Method
  44. Name:BinarySearch Type:Method
  45. Name:BinarySearch Type:Method
  46. Name:BinarySearch Type:Method
  47. Name:BinarySearch Type:Method
  48. Name:BinarySearch Type:Method
  49. Name:BinarySearch Type:Method
  50. Name:BinarySearch Type:Method
  51. Name:ConvertAll Type:Method
  52. Name:CopyTo Type:Method
  53. Name:CopyTo Type:Method
  54. Name:Exists Type:Method
  55. Name:Find Type:Method
  56. Name:FindAll Type:Method
  57. Name:FindIndex Type:Method
  58. Name:FindIndex Type:Method
  59. Name:FindIndex Type:Method
  60. Name:FindLast Type:Method
  61. Name:FindLastIndex Type:Method
  62. Name:FindLastIndex Type:Method
  63. Name:FindLastIndex Type:Method
  64. Name:ForEach Type:Method
  65. Name:GetEnumerator Type:Method
  66. Name:IndexOf Type:Method
  67. Name:IndexOf Type:Method
  68. Name:IndexOf Type:Method
  69. Name:IndexOf Type:Method
  70. Name:IndexOf Type:Method
  71. Name:IndexOf Type:Method
  72. Name:LastIndexOf Type:Method
  73. Name:LastIndexOf Type:Method
  74. Name:LastIndexOf Type:Method
  75. Name:LastIndexOf Type:Method
  76. Name:LastIndexOf Type:Method
  77. Name:LastIndexOf Type:Method
  78. Name:Reverse Type:Method
  79. Name:Reverse Type:Method
  80. Name:Sort Type:Method
  81. Name:Sort Type:Method
  82. Name:Sort Type:Method
  83. Name:Sort Type:Method
  84. Name:Sort Type:Method
  85. Name:Sort Type:Method
  86. Name:Sort Type:Method
  87. Name:Sort Type:Method
  88. Name:Sort Type:Method
  89. Name:Sort Type:Method
  90. Name:Sort Type:Method
  91. Name:Sort Type:Method
  92. Name:Sort Type:Method
  93. Name:Sort Type:Method
  94. Name:Sort Type:Method
  95. Name:Sort Type:Method
  96. Name:Sort Type:Method
  97. Name:TrueForAll Type:Method
  98. Name:Initialize Type:Method
  99. Name:ToString Type:Method
  100. Name:Equals Type:Method
  101. Name:GetHashCode Type:Method
  102. Name:GetType Type:Method
  103. Name:Length Type:Property
  104. Name:LongLength Type:Property
  105. Name:Rank Type:Property
  106. Name:SyncRoot Type:Property
  107. Name:IsReadOnly Type:Property
  108. Name:IsFixedSize Type:Property
  109. Name:IsSynchronized Type:Property


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值