如何将一系列阵列元素克隆到新阵列?

我有一个由10个元素组成的数组X。我想创建一个新数组,包含从X开始的从索引3到索引7的所有元素。当然,我可以很容易地编写一个循环,这将为我做到这一点,但我想保持我的代码尽可能干净。有没有一种C#语言的方法可以帮我做到这一点

类似于(伪代码):

Array NewArray=oldArray.createNewArrayFromRange(int-BeginIndex,int-EndIndex)

数组。复制不符合我的需要。我需要新阵列中的项目是克隆的Array.copy只是一个C风格的memcpy等价物,它不是我想要的

您可以将其添加为扩展方法:

公共静态T[]子阵列<T>(此T[]数据,整数索引,整数长度)
{
T[]结果=新的T[长度];
复制(数据、索引、结果、0、长度);
返回结果;
}
静态void Main()
{
int[]数据={0,1,2,3,4,5,6,7,8,9};
int[]sub=data.SubArray(3,4);//包含{3,4,5,6}
}

更新重新克隆(这在原始问题中并不明显)。如果你真的想要一个深度克隆;比如:

公共静态T[]子阵列深度克隆<T>(此T[]数据,整数索引,整数长度)
{
T[]arrCopy=新的T[长度];
Array.Copy(数据、索引、arrCopy、0、长度);
使用(MemoryStream ms=new MemoryStream())
{
var bf=新的二进制格式化程序();
bf.序列化(ms,arrCopy);
ms.Position=0;
返回(T[])bf.反序列化(ms);
}
}

但是,这确实要求对象可序列化([serializable]ISerializable)。您可以根据需要轻松替换任何其他序列化程序-XmlSerializerDataContractSerializer、protobuf-net等

请注意,如果没有序列化,深度克隆是很棘手的;特别是,在大多数情况下,ICloneable很难被信任

发表评论