標籤:c# c#數組 array array類
簡單的數組知識代碼及注釋講解
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"); } } }}