C#:shlwapi.dll 中 StrCmpLogicalW 的实现或替代

2023-12-28

为了在我的应用程序中进行自然排序,我当前在 shlwapi.dll 中 P/Invoke 一个名为 StrCmpLogicalW 的函数。我正在考虑尝试在 Mono 下运行我的应用程序,但当然我不能拥有这个 P/Invoke 东西(据我所知)。

是否可以在某处看到该方法的实现,或者是否有一个良好、干净且高效的 C# 代码片段可以执行相同的操作?

我的代码目前如下所示:

[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    public static extern int StrCmpLogicalW(string psz1, string psz2);
}

public class NaturalStringComparer : IComparer<string>
{
    private readonly int modifier = 1;

    public NaturalStringComparer() : this(false) {}
    public NaturalStringComparer(bool descending)
    {
        if (descending) modifier = -1;
    }

    public int Compare(string a, string b)
    {
        return SafeNativeMethods.StrCmpLogicalW(a ?? "", b ?? "") * modifier;
    }
}

因此,我正在寻找的是上述类的替代方案,它不使用 extern 函数。


我刚刚在 C# 中实现了自然字符串比较,也许有人会发现它很有用:

public class NaturalComparer : IComparer<string>
{
   public int Compare(string x, string y)
   {
      if (x == null && y == null) return 0;
      if (x == null) return -1;
      if (y == null) return 1;

      int lx = x.Length, ly = y.Length;

      for (int mx = 0, my = 0; mx < lx && my < ly; mx++, my++)
      {
         if (char.IsDigit(x[mx]) && char.IsDigit(y[my]))
         {
            long vx = 0, vy = 0;

            for (; mx < lx && char.IsDigit(x[mx]); mx++)
               vx = vx * 10 + x[mx] - '0';

            for (; my < ly && char.IsDigit(y[my]); my++)
               vy = vy * 10 + y[my] - '0';

            if (vx != vy)
               return vx > vy ? 1 : -1;
         }

         if (mx < lx && my < ly && x[mx] != y[my])
            return x[mx] > y[my] ? 1 : -1;
      }

      return lx - ly;
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:shlwapi.dll 中 StrCmpLogicalW 的实现或替代 的相关文章

随机推荐

  • 将空值插入 cassandra

    我有一些字段存储到 Cassandra 中 但其中一些字段在任何给定点都可能为空 由于它们的数量相当多 如果我在将它们添加到 INSERT 之前不检查每一个是否为空 它会使代码更具可读性 这样做有什么坏处吗 EDIT 我找到了一张 jira
  • 使用 python requests 库进行谷歌搜索

    我尝试过查找 但所有其他答案似乎都在使用 urllib2 我刚刚开始尝试使用请求 但我仍然不太清楚如何从页面发送或请求其他内容 例如 我将有 import requests r requests get http google com 但我
  • Apache POI 将系列名称添加到 LineChart 中

    我正在 Excel 文档中使用 Apache POI 创建折线图 据我设法实现的目标如下图所示 我使用 Apache svn 中的示例编写了代码 所以我当前的方法如下所示 Drawing drawing question createDra
  • 从有限集中进行朴素随机选择的 O 值是多少?

    这个问题 https stackoverflow com questions 1293609 randomize value in javascript从有限集中获取随机值让我思考 人们想要从一组 Y 值中检索 X 个唯一值是很常见的 例如
  • 在 C# 中使用时间跨度简化 if else 条件

    我必须创建一份实时报告 为此 我必须为特定日期的每个小时编写条件 在下面的代码中 条件检查当前星期几 然后检查当前时间 并据此生成报告 protected void sample TimeSpan zerothHour new TimeSp
  • 从 z3 模型中仅提取一个值

    我正在寻找相当于 z3 源 API获取价值 例如 当我有以下查询时 我可以轻松指定我想要查看哪些值 declare const s1 String declare const s2 String assert 8 str len s1 as
  • Android 2.2 SSL 客户端证书错误?

    我的问题 有没有人在具有多个证书链的 Android 2 1 2 2 中成功验证了带有客户端证书的 SSL 连接 细节 我正在尝试为Android平台实现客户端证书身份验证 StackOverflow 中已经有很多关于如何使用 KeySto
  • 使用 python 将 tiff 堆栈加载到 numpy 数组中

    我在 tif 文件方面遇到了一些问题 我确信这只是一个我无法解决的小问题 请记住 我是一个相对较新的程序员 基本上 我准备了大小为 64x64xn 的 tif 文件 n 最多 1000 该图像只是包含所有这些切片的单个文件 我想将图像加载到
  • 如何强制 WPF ListView 重新查询它的 ItemSsource?

    我正在即时重写其 XML itemSource 并希望它立即使用新数据 您应该使用 ObervableCollection 当此集合更新时 ListView 也会更新 但如果出于某种原因您不想使用它 请使用 listView Invalid
  • 通过 oData API 从 Power BI 访问 Azure Devops 用户故事中的描述和接受标准

    我正在尝试从 PowerBI 的 Azure DevOps 的用户故事工作项类型中检索描述和接受标准字段 我尝试过 oData feed 还配置了分析视图 并搜索了在线文档 但均无济于事 有没有人成功地做到过这一点 我实际上想做的是确定两个
  • 简单类 - 是内存泄漏吗?

    我有一个非常简单的类 它有一个整数变量 我只是将变量 i 的值打印到屏幕上并递增它 并使线程休眠 1 秒 当我针对此方法运行探查器时 即使我没有创建任何新变量 内存使用量也会缓慢增加 执行此代码大约 16 小时后 我发现内存使用量增加到 4
  • 如何禁用基于颜色的分组条形图表达?

    我有一个包含 3 列的 pandas 数据框 名称 组 值 我想制作一个水平条形图 从最高值到最低值排序 并根据组列中的值对每个条形进行着色 问题是 当我添加颜色参数时 条形也会按颜色排序 是否可以使条形不按颜色分组在一起 这是我尝试过的
  • 如何在Flutter中制作倒圆角的容器?

    这是制作圆角容器的方法 Container decoration BoxDecoration borderRadius BorderRadius circular 10 但是有没有办法制作如下图所示的倒圆角呢 我在网上找不到任何东西 作为一
  • jQuery - 触发器('click')在 IE 中不起作用 - 对象不支持此属性或方法

    我有一个图像 悬停时有一个淡入淡出的覆盖 div 其中显示文本链接 单击链接时 它会打开一个包含内容的影子框 我希望整个覆盖 div 都是可点击的 所以我使用了 div overlay each function this click fu
  • 错误 SocketEnginePolling:长轮询请求期间出错

    let manager SocketManager socketURL URL string Some url config log true compress var socket SocketIOClient var name Stri
  • 使用 Socket 将数据从 [Python 客户端] 发送到 [C# 服务器]

    我想使用简单的套接字应用程序将字节数据从 Python 客户端发送到 C 服务器 C 服务器与 C 客户端运行良好 但是当我尝试使用 Python Socket 将数据发送到 C 服务器时 数据永远不会到达 我不太习惯 Python 有人可
  • PhoneGap、Bootstrap 还是 JQuery Mobile? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个用 HTML CSS 和 JavaScript 编码的 Web 应用程序 我对这个应用程序的目标是最终让它在各种移动设备上运行 并保留网
  • 我可以将 webpack 源映射和源代码文件放在单独的文件夹中吗?

    我读了这个问题生产中的源映射文件 安全吗 https stackoverflow com questions 27345520 source maps files in production is it safe 我想用源代码在不同的文件夹
  • 在 Grails 中验证 IP 地址

    我正在寻找一种通过约束验证 Grails 中的 IP 地址的方法 这样的事情可能吗 package example class Ip String ip static constraints ip unique true inetAddre
  • C#:shlwapi.dll 中 StrCmpLogicalW 的实现或替代

    为了在我的应用程序中进行自然排序 我当前在 shlwapi dll 中 P Invoke 一个名为 StrCmpLogicalW 的函数 我正在考虑尝试在 Mono 下运行我的应用程序 但当然我不能拥有这个 P Invoke 东西 据我所知