首页 > 解决方案 > 从现有数组的一部分创建新数组的好方法是什么?

问题描述

鉴于byte[] buffer我想从子数组创建一个新数组。方法签名可能看起来像byte[] SubArray(byte[] buffer, int start, int length),但我可能宁愿只拥有一个整洁的 1-liner 而不是方法。

这是一个很好的整洁的 LINQ 版本,但感觉这可能不是很有效。是否有执行此操作的标准库方法,或者我必须创建一个新数组然后复制到它?

        var subArray = buffer.Skip(start).Take(length).ToArray();

标签: c#

解决方案


没有涉及创建新数组的有效方法,但是,您可以通过其他方式查看数组的一部分:

  • Memory<byte>/ ReadOnlyMemory<byte>- 实际上这是一个“跨度提供者”
  • Span<byte>/ ReadOnlySpan<byte>- 任何类型的原始内存(包括数组、内部指针和非托管内存)的抽象视图,但只能保存在堆栈上 - 如果需要存储它,则需要“内存”,而不是“跨度” )
  • ArraySegment<byte>- 明确地描述一个向量/偏移量/计数

以上所有的构造函数都带有一个byte[]和一个偏移量/计数对。

这些都不需要分配/复制。

如果你真的很想要一个byte[],那么:

var newArray = new byte[length];
Buffer.BlockCopy(oldArray, start, newArray, 0, length);

推荐阅读