您不需要编写自己的函数,.NET Framework 已经内置了所有内容。您有两种选择:
Array.Copy(sourceArray, srcStartIndex, targetArray, tgtStartIndex, srcNumberOfElements);
sourceArray.CopyTo(targetArray, tgtStartIndex);
我会先用一些例子来解释它们,最后我会把它们组合成一个函数
public static T[] CopyFromArray<T>(this T[] sourceArray, int startIndex, int endIndex)
正如您在问题中要求的那样(CopyTo 已被 .NET 保留,因此我将其重命名为 CopyFromArray)。
注意sourceArray 和targetArray 是任意类型的数组; srcStartIndex 是要复制的 sourceArray 的起始索引,tgtStartIndex 是要复制到的 targetArray 的起始索引,srcNumberOfElements 是要从源数组复制的元素数。
目标数组必须足够大以复制所有元素,否则会出错。
源数组的元素直接复制到目标数组中(“原位”),这就是函数没有返回任何数据的原因(返回类型为void)。
看这个例子:
void Main()
{
var target = new int[20];
var srcStart=1; var tgtStart=3; var srcElements=3;
Array.Copy((new int[] { 1,2,3,4,5,6,7,8,9 }), srcStart,
target, tgtStart, srcElements);
Console.WriteLine(string.Join(",", target));
}
正常工作并返回:
0,0,0,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0
注意srcStart指定源数组中的索引,它开始复制,而tgtStart指定目标数组中它开始插入的索引,最后srcElements指定有多少元素有要复制的。
注意还有一个更简单的版本,.CopyTo 方法。它的工作原理如下:
void Main()
{
var target = new int[20]; var tgtStart = 3;
(new int[] { 1,2,3,4,5,6,7,8,9 }).CopyTo(target, tgtStart);
Console.WriteLine(string.Join(",", target));
}
然后它返回:
0,0,0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0
第二个参数指定插入数据的位置的索引(就像前面例子中的tgtStart),这就是前3个元素为0的原因。
您也可以将其与其他数据类型一起使用,例如:
var target = new string[20];
(new string[] { "abc", "def", "ghi" }).CopyTo(target, 3);
以同样的方式工作。
关于您的问题,您可以使用我目前提供给您的信息来组合您自己的通用扩展方法,如下所示:
void Main()
{
int[] newThing1 = (new int[] { 10, 9, 8, 7, 6 }).CopyFromArray(2, 4);
newThing1.Dump();
string[] newThing2 = (new string[] { "A", "B", "C", "D"}).CopyFromArray(1, 3);
newThing2.Dump();
}
public static class Extensions
{
public static T[] CopyFromArray<T>(this T[] sourceArray, int startIndex, int endIndex)
{
int numberOfElements = endIndex - startIndex + 1;
var targetArray = new T[numberOfElements];
Array.Copy(sourceArray, startIndex, targetArray, 0, numberOfElements);
return targetArray;
}
}