在 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 中反转跨度的主要内容,如果未能解决你的问题,请参考以下文章
将 .NetStandard 2.0 Nuget 包安装到 VS2015 Net 4.6.1 项目中
Stan 代码适用于 Windows 但不适用于 Linux