结构体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#中复制数组及其方法介绍:点击打开链接