在 NetStandard 2 中反转跨度

Posted

技术标签:

【中文标题】在 NetStandard 2 中反转跨度【英文标题】:Reverse a Span in NetStandard 2 【发布时间】:2021-12-13 21:51:03 【问题描述】:

我需要反转一个Span<Char>,如果我使用的是 NetStandard 2.1 会很容易。

我可以使用MemoryExtensions.Reverse(Span),但不幸的是,我使用的版本不支持它。

我试图从repository 复制代码,但它使用了一些 NetStandard 2.0 中不存在的语言功能。

我不介意使用优化程度较低的实现,因为它在我的代码中并不经常使用。尽管如此,我还是无法将其转换为字符串然后反转它,因为我无法在此实现中处理垃圾收集触发器。

如何在不转换为字符串或升级 NetStandard 版本的情况下反转 Span<Char>

【问题讨论】:

【参考方案1】:

如果超级高效并不重要,为什么不使用简单的 for 循环?

Span<int> x = new[]  1, 2, 3, 4 .AsSpan();
for (int i = 0, j = x.Length - 1; i < j; i++, j--)

    var temp = x[i];
    x[i] = x[j];
    x[j] = temp;

【讨论】:

我不知道!看起来很合理,它只是一个数组,不是吗?它的 ReadonlySpan 但这可能会改变,谢谢。 顺便说一句,您提到的 C# 语言功能很可能与 .NET Standard 版本正交,而不是您的 C# 语言版本。 System.Memory 的最新版本仍然支持 .NET Standard 2.0。所以如果你不能更新到最新版本的 NuGet 包,并且由于某些原因你当前的项目不能使用最新的 C# 语言版本,但仍然希望使用更高效的实现,你应该能够构建一个单独的使用面向 .NET Standard 2.0 的最新语言版本打包并将其导入使用较低语言版本的其他项目中。 不,不是语言版本的问题,因为这些功能只存在于NetStandard 2.1中【参考方案2】:

安装最新的System.Memory NuGet 包,MemoryExtensions.Reverse 方法就可以使用了。

【讨论】:

不幸的是,这仅适用于 NetStandard 2.1 该包以 .net standard 2.0 为目标,可以安装到任何以 .net standard 2.0 为目标的项目中。如果您安装该软件包,无论目标版本如何,您都可以使用该方法。 Microsoft 文档说它在 .net 标准 2.1 中可用,而无需安装额外的 nuget 包,而不是无法使用该方法。 我已经安装了这个包。从 NetStandard 2.0 引用时,此包中没有 Span.Reverse

以上是关于在 NetStandard 2 中反转跨度的主要内容,如果未能解决你的问题,请参考以下文章

R语言stan进行贝叶斯推理分析

在 stan 中进行数据增强的概率回归

将 .NetStandard 2.0 Nuget 包安装到 VS2015 Net 4.6.1 项目中

Stan 代码适用于 Windows 但不适用于 Linux

无法加载文件或程序集'netstandard,版本 = 2.0.0.0

在R语言和Stan中估计截断泊松分布