【发布时间】:2018-06-29 19:53:50
【问题描述】:
除了string 版本之外,我正在尝试重载解析方法以使用ReadOnlySpan<char> 参数。问题是该实现使用Dictionary<string, T> 进行解析逻辑。
我尝试将其切换为Dictionary<ReadOnlySpan<char>, T>,但当然这不起作用,因为ReadOnlySpan<char> 不允许作为通用参数,因为它是一个仅堆栈对象。然后我将其切换为使用允许的ReadOnlyMemory<char>。然后我实现了一个基本的Ordinal 比较器,但现在我无法从ReadOnlySpan<char> 参数创建ReadOnlyMemory<char>。这可能吗?
更新
这似乎是不可能的。为了支持我在上面发布的场景,我将更改字典以具有一个 int 键,它是 ReadOnlySpan<char> 的哈希码,并使值成为一个列表,其中包含嵌入在元素中的字符串,并且必须手动解析哈希码碰撞。
【问题讨论】:
-
System.MemoryExtensions类中应该有一个AsMemory()方法来执行此操作,因为在移动设备上无法测试 -
很遗憾,
AsMemory()只接受strings、数组和ArraySegment<T>s。 -
由于 Spans 存在于堆栈中,您必须使用 ToArray() 方法将其复制到堆中。数组被隐式转换为 ReadOnlyMemory