如何比较两个带有多个点的“数字”?

2023-12-31

我有一个无序列表,看起来像这样:

1
2.2
1.1.1
3

当我对列表进行排序时,1.1.1 变得大于 3 和 2.2,2.2 变得大于 3。

这是因为 Double.Parse 删除了点并使其成为整数。

这是我用来排序的方法:

public class CompareCategory: IComparer<Category>
{
    public int Compare(Category c1, Category c2)
    {
        Double cat1 = Double.Parse(c1.prefix);
        Double cat2 = Double.Parse(c2.prefix);

        if (cat1 > cat2)
            return 1;
        else if (cat1 < cat2)
            return -1;
        else
            return 0;
    }
}

我怎样才能解决这个问题? 谢谢


这些版本号是偶然的吗?你能用吗the Version class http://msdn.microsoft.com/en-us/library/system.version.aspx?它按照您想要的方式对每个部分进行排序,尽管它最多只能处理 4 个部分。我不建议像您一样解析为数值。

它有一个IComparable界面。假设您的输入是字符串,下面是一个示例:

public class CompareCategory: IComparer<Category>
{
    public int Compare(Category c1, Category c2)
    {
        var cat1 = new Version(c1.prefix);
        var cat2 = new Version(c2.prefix);

        if (cat1 > cat2)
            return 1;
        else if (cat1 < cat2)
            return -1;
        else
            return 0;
    }
}

如果你需要超过 4 个“部分”的东西,我想我会创建一个比较器,它在点处分割字符串,然后将每个元素解析为整数并进行数字比较。确保考虑 1.002.3 和 1.3.3 等情况(您希望排序顺序是什么?)。

Update,这是我的意思的一个示例。轻微测试:

    public class CategoryComparer : Comparer<Category>
    {
        public override int Compare(Category x, Category y)
        {
            var xParts = x.prefix.Split(new[] { '.' });
            var yParts = y.prefix.Split(new[] { '.' });

            int index = 0;
            while (true)
            {
                bool xHasValue = xParts.Length > index;
                bool yHasValue = yParts.Length > index;
                if (xHasValue && !yHasValue)
                    return 1;   // x bigger
                if (!xHasValue && yHasValue)
                    return -1;  // y bigger
                if (!xHasValue && !yHasValue)
                    return 0;   // no more values -- same
                var xValue = decimal.Parse("." + xParts[index]);
                var yValue = decimal.Parse("." + yParts[index]);
                if (xValue > yValue)
                    return 1;   // x bigger
                if (xValue < yValue)
                    return -1;  // y bigger
                index++;
            }
        }
    }
    public static void Main()
    {
        var categories = new List<Category>()
        {
            new Category { prefix = "1" },
            new Category { prefix = "2.2" },
            new Category { prefix = "1.1.1" },
            new Category { prefix = "1.1.1" },
            new Category { prefix = "1.001.1" },
            new Category { prefix = "3" },
        };

        categories.Sort(new CategoryComparer());
        foreach (var category in categories)
            Console.WriteLine(category.prefix);
    }

Output:

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

如何比较两个带有多个点的“数字”? 的相关文章

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • Node.js 的编码错误

    我正在用node js 重写一个小的python 脚本 原来的脚本是这样工作的 coding utf 8 import urllib import httplib import json def rpc url args try post
  • boost::asio 干净地断开连接

    有时 boost asio 似乎在我想要之前断开连接 即在服务器正确处理断开连接之前 我不确定这是怎么可能的 因为客户端似乎认为它完全发送了消息 但是当服务器发出错误时 它甚至没有读取消息头 在测试期间 这种情况可能只发生五分之一 服务器收
  • C++ 如何生成随机路径

    我正在尝试编写一个函数 可以为给定的二维点数组 x y 生成随机路径 现在 该路径有一些我希望它满足的要求才能使其有效 路径cannot 是从点开始的一条直线A to B 自行返回但可以倒退 如下所示 平行 沿着自身运行 我还想确保路径从左
  • android尺寸之间的区别:pt和dp

    文档称 160 dp 与密度无关 等于 1 英寸 72 pt 也是 1 英寸 所以我不明白为什么 android 定义 dp 测量 而它似乎与点一样工作 有人能解释一下吗 如果可以使用 pt 为什么还要使用 dp Android 文档曾经错
  • javax.faces.component.StateHolderSaver 可能存在内存泄漏

    我们最近将一个应用程序从 Jboss EAP 6 1 迁移到 7 1 我们的应用程序随机开始进入完整的 GC 死亡螺旋 平均时间 12 秒停止世界 并在生产环境中耗尽内存 我们从 Jboss EAP 6 1 迁移到 7 1 Java从7到8
  • SQLite“插入或替换为”不起作用

    我必须在 sqlite 中编写一个查询来更新记录 如果存在 或插入它 如果记录尚不存在 我看过的语法INSERT OR REPLACE INTO from here https stackoverflow com questions 225
  • 隐藏散点图中绘制线上方的所有点

    绘制 2 个星系等效宽度比列表 我将它们相互绘制 然后我想消除该线上方的所有点y 0 61 x 0 05 1 3这样图中就只剩下下面的点了 这是我到目前为止所拥有的 我已经查看了堆栈溢出 但不知道如何实现这一点 注 我只想要上面的几点y n
  • 如何动态添加类方法?

    使用 Objective C Runtime 如何添加方法 layerClass给私人UIGroupTableViewCellBackground类 不是它的超类 UIView 注意 这仅用于测试 看看如何UITableViewStyleG
  • python:从字典中创建直方图

    我是 python 新手 正在学习如何以正确的方式做事 我有字典列表d 每个字典代表用户 包含user id 年龄等信息 这个列表d可以包含代表同一用户的多个字典 但信息略有不同 这对我的目的来说并不重要 我想创建直方图来显示有多少用户d与
  • Java 中是否有类似于 C# 匿名类型的功能?

    我想知道 Java 中是否存在类似于 C 匿名类型的类似功能 var a new Count 5 Message A string 或者这个概念违背了Java范式 EDIT 我想使用Hashable Java 中的情况有些类似 不 没有同等
  • LinkedIn iOS SDK 捆绑包后缀

    因此 我的 LinkedIn 应用帐户上有多个捆绑包标识符 对于其中每一个 我还创建了一个 URL 后缀方案 我设置 URL 类型的方式就像li appID suffix where appID 是 LinkedIn 上提供的应用程序 ID
  • 强制 Linq 不延迟执行

    其实这个问题和这篇文章是同一个问题 如何确保 LINQ 查询在 DAL 中调用时执行 而不是以延迟方式执行 https stackoverflow com q 1013201 75642 但既然他没有解释why他想要它 这个问题似乎被忽略了
  • 在R中使用grepl来匹配字符串

    我有一个帧数据 testData 如下 id content 1 I came from China 2 I came from America 3 I came from Canada 4 I came from Japan 5 I ca
  • 这段代码是否颠覆了 C++ 类型系统?

    我明白有一个constC 中的方法意味着对象通过该方法是只读的 但否则它仍然可能会发生变化 然而 这段代码显然通过const参考 即通过const方法 这段代码在 C 中合法吗 如果是这样 是否违反了const 类型系统的性质 为什么 为什
  • Web 服务显示 Jquery 令牌输入结果的正确响应应该是什么?

    我正在使用 Jquery 令牌输入插件 我尝试从数据库而不是本地数据中获取数据 我的 Web 服务返回的 json 结果封装在 xml 中
  • 为什么类定义的元类关键字参数接受可调用对象?

    背景 蟒蛇3文档 https docs python org 3 6 reference datamodel html determining the appropriate metaclass清楚地描述了类的元类是如何确定的 如果没有给出
  • 在控制器构造函数中使用 HttpContext

    我试图在控制器的构造函数中设置一个属性 如下所示 public ApplicationUserManager UserManager get private set public AccountController UserManager
  • 通用类型扩展 Number、计算

    我用一种方法制作了数学运算的接口 计算 采用不同数量的参数 public interface MathOperation public
  • JSZip解压错误

    试图处理JSZip http stuk github io jszip图书馆 我在解压缩文件时遇到问题 这是一个笨蛋演示 http plnkr co edit OJeWRhbDBKaPYAHb5x9b p preview 如您所见 我可以成
  • 如何比较两个带有多个点的“数字”?

    我有一个无序列表 看起来像这样 1 2 2 1 1 1 3 当我对列表进行排序时 1 1 1 变得大于 3 和 2 2 2 2 变得大于 3 这是因为 Double Parse 删除了点并使其成为整数 这是我用来排序的方法 public c