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

比如(伪代码):

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

100 doesn't fit my needs.我需要新数组中的项目是克隆的.Array.copy只是C-Style memcpy的类似功能,这不是我想要的.

推荐答案

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

public static T[] SubArray<T>(this T[] data, int index, int length)
{
    T[] result = new T[length];
    Array.Copy(data, index, result, 0, length);
    return result;
}
static void Main()
{
    int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] sub = data.SubArray(3, 4); // contains {3,4,5,6}
}

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

public static T[] SubArrayDeepClone<T>(this T[] data, int index, int length)
{
    T[] arrCopy = new T[length];
    Array.Copy(data, index, arrCopy, 0, length);
    using (MemoryStream ms = new MemoryStream())
    {
        var bf = new BinaryFormatter();
        bf.Serialize(ms, arrCopy);
        ms.Position = 0;
        return (T[])bf.Deserialize(ms);
    }
}

不过,这确实要求对象是可序列化的([Serializable]ISerializable).你可以很容易地在替身上搜索任何其他合适的串行器-XmlSerializerDataContractSerializertotobuf-net等等.

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

.net相关问答推荐

无法在Ubuntu 22.04.3上运行带有Rider 2023和DotNet-8.0的项目

PowerShell 5.1和7在使用证书时的区别

如何在PowerShell中隐藏任务延迟输出?

WinForm Task.Wait :为什么它会阻塞 UI?

无法对.NET MAUI类库进行单元测试

在数据网格中:如何在更改单元格 A 中的值后显示单元格 B 中的更改

从 Contentful 中的富文本元素中获取价值?

使用 Powershell TOM 在 SSAS 表格中创建分区

IIS 发布 ASP.NET Core 应用程序而不关闭 IIS 网站

无法使用 int.Parse 从字符串转换值

当 Func 委托需要接口作为参数时,它是如何工作的?

如何在选项卡中 Select Winforms NumericUpDown 中的所有文本?

如何在 FtpWebRequest 之前判断 FTP 上是否存在文件

BackgroundWorker 中未处理的异常

什么决定了 Path.GetTempPath() 的返回值?

在 ToString() 之前判断 null

多个添加的实体可能具有相同的主键

如何修复 .NET Windows 应用程序在启动时崩溃并出现异常代码:0xE0434352?

例外:不支持 URI 格式

为什么 IList 不支持 AddRange