C#中部分陣列ArraySegment
阿新 • • 發佈:2019-01-26
結構體ArraySegment<T>表示陣列的一段,如果需要使用不同的方式去處理一個大型陣列的不同部分,一個有效的方法是使用部分陣列來代替建立多個數組。
首先來看一下構造:他是一個結構體(這裡給出經常用到的部分),在 System 名稱空間下,包括兩個自定義構造方法,三個只讀屬性。
C#中只讀成員介紹:點選開啟連結// 泛型結構體 ArraySegment<T> public struct ArraySegment<T> { // 構造方法一:根據傳進來的引數初始化屬性:Array = array , Offset:0 , Count:array.length public ArraySegment(T[] array); // 構造方法二:根據傳進來的引數初始化屬性:Array = array , Offset:offset , Count:count public ArraySegment(T[] array, int offset, int count); // 只讀屬性:構造方法中傳進來的陣列 public T[] Array { get; } // 只讀屬性:擷取時的起始下標 public int Offset { get; } // 只讀屬性:擷取時的擷取長度 public int Count { get; } }
下面給出利用部分陣列建立方法示例:需要特別注意的是,上面結構體的 Array 屬性得到的是原陣列,Count 屬性代表的是擷取長度。
下面給出呼叫示例:注意,當需要用到的部分資料較少時,使用Array.Copy( ) 方法更簡單。public class ArrayTest { // 引數:原陣列的一部分,注意:這種情況使用 Array.Copy()方法更簡便 public static int GetSegmentSum(ArraySegment<int> SegmentArray) { int sum = 0; // 從起始下標開始,到最終擷取的下標 for (int i = SegmentArray.Offset; i < SegmentArray.Offset + SegmentArray.Count; i++) { // 對陣列的這一部分進行操作,注意 SegmentArray.Array 獲取的是原陣列 sum += SegmentArray.Array[i]; } return sum; } // 引數:是已經擷取好的陣列(可以使用 Array.Copy()方法獲取) public static int GetSegmentSum(int[] SegmentArray) { int sum = 0; // for (int i = 0; i < SegmentArray.Length; i++) { sum += SegmentArray[i]; } return sum; } // 引數:原陣列的幾個部分組成的陣列,這種情況使用部分陣列很簡便,不用建立多個方法和多個數組 public static int GetSegmentSum(ArraySegment<int>[] SegmentArray) { int sum = 0; for (int i = 0; i < SegmentArray.Length; i++) { for(int j = SegmentArray[i].Offset;j < SegmentArray[i].Offset + SegmentArray[i].Count;j++) { // 這裡只是給出一個簡單的處理,是為了表明可以很方便的處理一個數組的不同部分 if(i == 0) { sum += SegmentArray[i].Array[j]; } else { sum -= SegmentArray[i].Array[j]; } } } return sum; } }
int[] aa = { 1,2,3,4,5,6,7,8,9}; // 1.建立部分陣列,從aa 陣列的下標 5 開始,長度是 4 ArraySegment<int> bb = new ArraySegment<int>(aa,5,4); // 2.建立複製複製陣列 bb1,長度是 4 int[] bb1 = new int[4]; // 從 aa 陣列下標 5 開始複製,到bb陣列下標 0 開始,複製長度是 4,最終 bb = {6,7,8,9} Array.Copy(aa,5,bb1,0,4); // 3.建立多個部分陣列 ArraySegment<int>[] bb2 = { new ArraySegment<int>(aa,0,4), new ArraySegment<int>(aa,5,4) }; // 呼叫方法測試 int sum = ArrayTest.GetSegmentSum(bb); // 6+7+8+9 = 30 int sum1 = ArrayTest.GetSegmentSum(bb1); // 6+7+8+9 = 30 int sum2 = ArrayTest.GetSegmentSum(bb2); // 1+2+3+4-(6+7+8+9) = -20
C#中複製陣列及其方法介紹:點選開啟連結