c# - 从现有数组的一部分创建新数组的好方法是什么?
问题描述
鉴于byte[] buffer
我想从子数组创建一个新数组。方法签名可能看起来像byte[] SubArray(byte[] buffer, int start, int length)
,但我可能宁愿只拥有一个整洁的 1-liner 而不是方法。
这是一个很好的整洁的 LINQ 版本,但感觉这可能不是很有效。是否有执行此操作的标准库方法,或者我必须创建一个新数组然后复制到它?
var subArray = buffer.Skip(start).Take(length).ToArray();
解决方案
没有涉及创建新数组的有效方法,但是,您可以通过其他方式查看数组的一部分:
Memory<byte>
/ReadOnlyMemory<byte>
- 实际上这是一个“跨度提供者”Span<byte>
/ReadOnlySpan<byte>
- 任何类型的原始内存(包括数组、内部指针和非托管内存)的抽象视图,但只能保存在堆栈上 - 如果需要存储它,则需要“内存”,而不是“跨度” )ArraySegment<byte>
- 明确地描述一个向量/偏移量/计数
以上所有的构造函数都带有一个byte[]
和一个偏移量/计数对。
这些都不需要分配/复制。
如果你真的很想要一个byte[]
,那么:
var newArray = new byte[length];
Buffer.BlockCopy(oldArray, start, newArray, 0, length);
推荐阅读
- html - 为什么在我的 html 头标签中添加 google 字体链接后我的网页会抖动?
- owl-carousel - 为什么猫头鹰轮播不喜欢doctype?
- package - 重新定义已删除的包(Common Lisp)
- swift - SwiftUI 崩溃预览中具有资产目录颜色的颜色扩展
- python - 无法使用函数测试 Pandas 数据框中的 NaT
- python - 如何使用python将下一个文本存储在电报机器人中
- swift - 在 SWIFT 中分解字符串
- apache-spark - 结构化流 CoarseGrainedExecutorBackend:驱动程序命令关闭
- kubernetes - DNS 查找在 Kubernetes 集群中无法正常工作
- jsonschema - JSON模式递归似乎没有正确验证