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

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

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

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

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

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

【问题讨论】:

    标签: c# arrays string .net-standard-2.0


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多