1. 程式人生 > >C#中部分陣列ArraySegment

C#中部分陣列ArraySegment

結構體ArraySegment<T>表示陣列的一段,如果需要使用不同的方式去處理一個大型陣列的不同部分,一個有效的方法是使用部分陣列來代替建立多個數組。

首先來看一下構造:他是一個結構體(這裡給出經常用到的部分),在 System 名稱空間下,包括兩個自定義構造方法,三個只讀屬性。

// 泛型結構體 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; }
}
C#中只讀成員介紹點選開啟連結

下面給出利用部分陣列建立方法示例:需要特別注意的是,上面結構體的 Array 屬性得到的是原陣列,Count 屬性代表的是擷取長度。

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;
	}
}
下面給出呼叫示例:注意,當需要用到的部分資料較少時,使用Array.Copy( ) 方法更簡單。
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#中複製陣列及其方法介紹點選開啟連結