简单的数组知识代码及注释讲解
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace Array类 { class Program { static void Main(string[] args) { //Array是一个抽象类,不能使用构造函数来创建数组 //创建数组 Array arr = Array.CreateInstance(typeof(int), 5);//创建类型为int,大小为5的数组。 //设置对应元素的值SetValue() for (int i = 0; i < 5; i++) { arr.SetValue(33, i); } //读取对应元素的值 for (int i = 0; i < 5; i++) { Console.WriteLine(arr.GetValue(i)); } //强制转化 int[] arrInt = (int[])arr; //创建多维数组和不基于0的数组,下面创建一个包含2*3个元素的二维数组。第一维基于1,第二维基于10 int[] lengths = { 2, 3 }; int[] lowerBounds = { 1, 10 }; Array racers = Array.CreateInstance(typeof(Person), lengths, lowerBounds); racers.SetValue(new Person { FirstName = "aa", LastName = "bb" }, 1, 10); racers.SetValue(new Person { FirstName = "cc", LastName = "dd" }, 1, 11); racers.SetValue(new Person { FirstName = "ee", LastName = "ff" }, 1, 12); racers.SetValue(new Person { FirstName = "gg", LastName = "hh" }, 2, 10); racers.SetValue(new Person { FirstName = "ii", LastName = "jj" }, 2, 11); racers.SetValue(new Person { FirstName = "kk", LastName = "ll" }, 2, 12); //复制数组: //因为数组是引用类型,所以将一个数组变量赋予给另一个数组变量,就会得到两个引用同一数组的变量。 //而复制数组,会使数组实现ICloneable接口,这个接口定义的Clone()方法会创建数组的浅表副本。 //如果数组的元素是值类型,以下代码就会复制所有的值 int[] arrClone = { 1, 2 }; int[] arrClone2 = (int[])arrClone.Clone(); //如果数组包含引用类型,则不复制元素,而复制引用。 Person[] p1 = { new Person { FirstName="aa", LastName="bb"}, new Person { FirstName="cc", LastName="dd"} }; Person[] p2 = (Person[])p1.Clone(); p2[0] = new Person { FirstName = "ee", LastName = "ff" }; //Clone()与Copy()区别 //1.都是创建浅表副本 //2.Clone()方法创建一个新的数组 //3.Copy()方法必须传递阶数相同且有足够元素的已有数组 //Copy()方法 int[] arr1 = { 1, 2, 3, 4 }; int[] arr2 = { 5, 6, 7, 8, 9, 10, 11 }; arr1.CopyTo(arr2, 2); //浅表副本与深层副本:浅复制就是仅复制类中的值类型成员 //深复制就是复制类中的值类型成员和引用类型的成员。 //排序:注意IComparable<Person>接口与IComparer<Person>接口的不同 //(1) string[] names = { "bb", "ff", "aa", "cc", "ee", "dd" }; Array.Sort(names); foreach (string name in names) { Console.WriteLine(name); } //对自定义类数组进行排序,需要实现IComparable接口, Person[] p3 = { new Person { FirstName="aa", LastName="bb"}, new Person { FirstName="cc", LastName="dd"}, new Person { FirstName="ee", LastName="ff"}, new Person { FirstName="dd", LastName="dd"} }; Array.Sort(p3); foreach (var p in p3) { Console.WriteLine(p.ToString()); } //(2) Person[] p4 = { new Person { FirstName="aa", LastName="bb"}, new Person { FirstName="cc", LastName="dd"}, new Person { FirstName="ee", LastName="ff"}, new Person { FirstName="dd", LastName="dd"} }; Array.Sort(p4, new PersonCompare(PersonCompareType.FirstName)); foreach (var p in p3) { Console.WriteLine(p.ToString()); } //数组作为参数 //在方法中返回数组 //static Person[] GetPersons() //{ // return new Person[] { // new Person { FirstName="aa", LastName="bb"}, // new Person { FirstName="cc", LastName="dd"}, // new Person { FirstName="ee", LastName="ff"}, // new Person { FirstName="dd", LastName="dd"} // }; //} //参数 //static void DisplayPersons(Person[] person) //{ //} //数组的协变 //说明:数组支持协变。这表示数组可以声明为基类,其派生类型的元素可以赋予数组元素。 //例如:可以声明一个object[]类型的参数,给它传递一个参数Person[] //static void DisplayPersons(object[] person) //{ //} //ArraySegment<T> int[] ar1 = { 1, 3, 5, 7, 9 }; int[] ar2 = { 2, 4, 6, 8, 10 }; var segments = new ArraySegment<int>[2] { new ArraySegment<int>(ar1,2,3), new ArraySegment<int>(ar2,1,4), }; int sum = SumOfSegments(segments); Console.ReadKey(); } static int SumOfSegments(ArraySegment<int>[] segments) { int sum = 0; foreach (var segment in segments) { int offset = segment.Offset; int count = segment.Count; for (int i = offset; i < offset + count; i++) { sum = sum + segment.Array[i]; } } return sum; } } public class Person : IComparable<Person> { 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) { return 1; } int result = string.Compare(this.LastName, other.LastName); if (result == 0) { result = string.Compare(this.FirstName, other.FirstName); } return result; } } //排序(2)使用的类 //解释说明:类PersonCompare实现了IComparable<Person>接口,可以按照FirstName或LastName对Person对象进行排序。 //枚举PersonCompareType定义了可用于PersonCompare的排序选项:FirstName和LastName。 //排序方式由PersonCompare类的构造函数定义,在该构造函数中设置了一个PersonCompareType值。 //实现Compare()方法时用一个swith语句指定是按FirstName还是LastName排序。 public enum PersonCompareType { FirstName, LastName } public class PersonCompare : IComparer<Person> { private PersonCompareType compareType; public PersonCompare(PersonCompareType compareType) { this.compareType = compareType; } public int Compare(Person x, Person y) { if (x == null && y == null) return 0; if (x == null) return 1; if (y == null) return -1; switch (compareType) { case PersonCompareType.FirstName: return string.Compare(x.FirstName, y.FirstName); case PersonCompareType.LastName: return string.Compare(x.LastName, y.LastName); default: throw new ArgumentException("unexpected compare type"); } } } }
C# Array类 【温故而知新】
时间: 2024-10-21 14:26:57