我应该如何从 Span/ReadOnlySpan 创建 ImmutableArray?

问题描述 投票:0回答:2

假设我有如下方法:

unsafe void Convert(byte* ptr, int length)
{
    var span = new Span<byte>(ptr, length);
    var arr = ImmutableArray.CreateRange(span); // error: cannot convert from 'System.Span<byte>' to 'System.Collections.Generic.IEnumerable<byte>'
    Use(arr);
}

上面示例中的

CreateRange
方法是
CreateRange<T>(IEnumerable<T>)
重载。由于 Span 没有实现任何接口,因此我们无法进行此调用是有道理的。但我实际上有点困惑不知道该怎么做。是否有一些惯用的方法可以通过最少的复制/分配从 Span 创建 ImmutableArray? (即使用
Span<T>.ToArray()
然后使用
ImmutableArray<T>.ToImmutableArray()
并不理想)

也将不胜感激任何涉及以某种方式直接使用指针+长度的建议。

c#
2个回答
4
投票

有一个未决问题(截至 2021 年 6 月)讨论为此添加 API。

在那之前,该问题建议使用这样的构建器:

static ImmutableArray<T> ImmutableArrayFromSpan<T>(ReadOnlySpan<T> span)
{
    var builder = ImmutableArray.CreateBuilder<T>(span.Length);
    foreach (var i in span) {
        builder.Add(i);
    }
    return builder.MoveToImmutable();
}

0
投票
从 .NET 7 开始,

ImmutableArray.Create
ToImmutableArray
具有基于 Span 的重载。

© www.soinside.com 2019 - 2024. All rights reserved.