据说ReadOnlySpan<char>非常适合解析,因此我尝试使用它,并且遇到了一个我不知道如何处理的用例。



我有一个命令行string,其中参数前缀-和分隔符(空格)被转义了(我知道我可以在这里引用它们,但是为了解决这个问题,让我们假设它不是一个选项):

 var str = @"foo -bar \-baz\ qux".AsMemory();


令牌生成器应返回以下令牌:


foo-命令名称
bar-参数名称
-baz qux-参数值


案例12很简单,因为在这里我只能使用str.Slice(i, length),但是如何创建3rd案例并仅返回一个ReadOnlySpan<char>Slice方法不允许我指定多个start/length范围,这对于跳过转义字符\是必需的。

例:


str.Slice((10, 4), (15, 3));



其中(10,4) = "-bar"(15,3) = " qux"

使用StringBuilder,您可以仅跳过几个字符,以后再跳过其他字符。 Append如何获得相同的结果?

最佳答案

Span/ReadOnlySpan是连续的内存块。它不能包含多个范围。此设计对于性能而言是必需的。 Span/ReadOnlySpan应该和数组一样快。数组之所以快,是因为它们是连续的内存块,没有进一步的抽象。

我看不到不分配新字符串就可以做到这一点的方法。您可以对所有连续的子字符串使用Span/ReadOnlySpan,但是您的解析问题似乎不适合使用span存储结果。

关于c# - 使用ReadOnlySpan <char>处理转义序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51346366/

10-15 14:29