我有一个包含10个元素的数组X。我想创建一个新数组,包含X中从索引3开始并在索引7结束的所有元素。当然,我可以很容易地写一个循环,将它为我,但我想保持我的代码尽可能干净。c#中有一个方法可以帮我做这个吗?
类似(伪代码):
Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)
数组中。拷贝不符合我的需要。我需要在新数组中的项目是克隆。数组中。copy只是一个c风格的memcpy等效,这不是我要找的。
array1 = [5,6,7,8];
int[] array2 = new int[2];
Array.ConstrainedCopy(array1, 1, array2, 0, 2);
array2 = [6,7];
数组中。ConstrainedCopy有五个(5)参数:
源数组
源数组的起始索引(sourceIndex)
目标数组(destinationArray)
目标数组起始索引(destinationIndex)
要复制的元素数量(长度)
array1 = [5,6,7,8];
int[] array2 = new int[2];
Array.ConstrainedCopy(array1, 1, array2, 0, 2);
array2 = [6,7];
数组中。ConstrainedCopy有五个(5)参数:
源数组
源数组的起始索引(sourceIndex)
目标数组(destinationArray)
目标数组起始索引(destinationIndex)
要复制的元素数量(长度)
以Marc的回答为基础,但加入了想要的克隆行为
public static T[] CloneSubArray<T>(this T[] data, int index, int length)
where T : ICloneable
{
T[] result = new T[length];
for (int i = 0; i < length; i++)
{
var original = data[index + i];
if (original != null)
result[i] = (T)original.Clone();
return result;
}
如果实现ICloneable太辛苦了,那么可以使用Håvard Stranden的Copyable库来完成所需的繁重工作。
using OX.Copyable;
public static T[] DeepCopySubArray<T>(
this T[] data, int index, int length)
{
T[] result = new T[length];
for (int i = 0; i < length; i++)
{
var original = data[index + i];
if (original != null)
result[i] = (T)original.Copy();
return result;
}
注意,OX.Copyable实现适用于以下任何一种:
然而,为了让自动复制工作,以下语句之一必须成立,例如:
它的类型必须有一个无参数构造函数,或者
它必须是可复制的,或者
它必须为其类型注册一个IInstanceProvider。
所以这应该适用于你遇到的任何情况。如果你克隆的对象子图中包含db连接或文件/流句柄,你显然有问题,但这对任何广义深度复制都是真的。
如果你想使用其他深度复制方法,本文列出了其他几种方法,所以我建议你不要尝试自己编写。