C#使用自定义的比较器对版本号(编码)字符串进行排序

给定一些数据,如下所示:

“1.10.1.1.1.2”,
“1.1”,
“2.2”,
“1.1.1.1”,
“1.1.3.1”,
“1.1.1”,
“2.10.1.1.1”,
“1.1.2.1”,
“1.2.1.1”,
“2.5.1.1”,
“1.10.1.1”,
“1.10.2.1”,
“1.11.3.1”,
“1.11.12.1”,
“1.11.11.1”,
“1.11.3.1”,
“1”,
“1.1.1.1.1”,
“1.1.1.1.1.1”

实现效果:
按照每个节点层级的大小进行排序,如下效果:

C#使用自定义的比较器对版本号(编码)字符串进行排序_第1张图片
实现代码如下:

  1. 引入命名空间:
using System;
using System.Collections.Generic;

这里引入了两个命名空间,System 命名空间提供了访问常用的数据类型和基本功能的类,System.Collections.Generic 命名空间则包含了泛型集合类的定义,如 List

  1. 自定义比较器类:
class CustomComparer : IComparer<string>
{
    // Compare 方法用于比较两个字符串,实现了 IComparer 接口
    public int Compare(string x, string y)
    {
        // 将版本号字符串按 '.' 分隔为字符串数组
        string[] partsX = x.Split('.');
        string[] partsY = y.Split('.');

        // 找出两个数组的最小长度
        int minLength = Math.Min(partsX.Length, partsY.Length);

        // 逐个比较每个部分的版本号
        for (int i = 0; i < minLength; i++)
        {
            int numX = int.Parse(partsX[i]); // 将部分转换为整数
            int numY = int.Parse(partsY[i]);

            // 如果当前部分的版本号不相等,则返回比较结果
            if (numX != numY)
            {
                return numX.CompareTo(numY); // 返回整数的比较结果
            }
        }

        // 如果前面的部分都相等,比较版本号的长度
        return partsX.Length.CompareTo(partsY.Length);
    }
}

这个类实现了 IComparer 接口,该接口定义了比较两个字符串的方法。CustomComparer 类中的 Compare 方法根据版本号的每个部分逐个比较,如果发现不同的部分,就返回比较结果;如果所有部分都相同,则比较字符串的长度。

  1. 主程序类:
class Program
{
    static void Main()
    {
        // 创建一个包含版本号字符串的列表
        List<string> data = new List<string>
        {
            "1.10.1.1.1.2",
            "1.1",
            "2.2",
            "1.1.1.1",
            "1.1.3.1",
            "1.1.1",
            "2.10.1.1.1",
            "1.1.2.1",
            "1.2.1.1",
            "2.5.1.1",
            "1.10.1.1",
            "1.10.2.1",
            "1.11.3.1",
            "1.11.12.1",
            "1.11.11.1",
            "1.11.3.1",
            "1",
            "1.1.1.1.1",
            "1.1.1.1.1.1"
        };

        // 使用自定义比较器对列表进行排序
        data.Sort(new CustomComparer());

        // 遍历排序后的列表并输出结果
        foreach (var item in data)
        {
            Console.WriteLine(item);
        }
    }
}

在主程序类中,首先创建了一个包含版本号字符串的列表 data,然后使用 Sort 方法对列表进行排序,传入了一个自定义的比较器 CustomComparer 实例。最后,通过循环遍历排序后的列表,并将每个元素输出到控制台。 使用自定义的比较器对版本号字符串进行排序,排序规则是按照版本号的每个部分逐个比较,优先比较较低级别的部分,如果所有部分相等,则比较字符串的长度。排序结果会按照版本号从小到大的顺序输出。

你可能感兴趣的:(C#,c#,开发语言)