C# 如何从Span/ReadOnlySpan创建不可变数组?
假设我有如下方法:C# 如何从Span/ReadOnlySpan创建不可变数组?,c#,C#,假设我有如下方法: 不安全的无效转换(字节*ptr,整数长度) { var span=新的span(ptr,长度); var arr=ImmutableArray.CreateRange(span);//错误:无法从“System.span”转换为“System.Collections.Generic.IEnumerable” 使用(arr); } 上面示例中的CreateRange方法是CreateRange(IEnumerable)重载。因为Span没有实现任何接口,所以我们不能进行此调用
不安全的无效转换(字节*ptr,整数长度)
{
var span=新的span(ptr,长度);
var arr=ImmutableArray.CreateRange(span);//错误:无法从“System.span”转换为“System.Collections.Generic.IEnumerable”
使用(arr);
}
上面示例中的CreateRange
方法是CreateRange(IEnumerable)
重载。因为Span没有实现任何接口,所以我们不能进行此调用是有道理的。但实际上我有点困惑,不知道该怎么做。是否有一些惯用的方法从一个跨度创建一个不可变数组,而复制/分配最少?(即,使用Span.ToArray()
然后使用ImmutableArray.ToImmutableArray()
将不理想)
如果您有任何建议,包括以某种方式直接使用指针+长度,我们也将不胜感激。目前(截至2021年6月)正在讨论为此添加API
在此之前,问题建议使用以下生成器:
静态ImmutableArray ImmutableArrayFromSpan(只读span)
{
var builder=ImmutableArray.CreateBuilder(span.Length);
foreach(跨度中的var i){
增加(i);
}
返回builder.MoveToImmutable();
}
不幸的是没有,因为ImmutableArray
没有Span
构造函数。你得复印两份。但是它应该很快,因为ToArray
知道预先的大小,所以只需要一个额外的分配。