给定一些数据,如下所示:
“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”
实现效果:
按照每个节点层级的大小进行排序,如下效果:
实现代码如下:
- 引入命名空间:
using System;
using System.Collections.Generic;
这里引入了两个命名空间,System
命名空间提供了访问常用的数据类型和基本功能的类,System.Collections.Generic
命名空间则包含了泛型集合类的定义,如 List<T>
。
- 自定义比较器类:
class CustomComparer : IComparer<string>
{
// Compare 方法用于比较两个字符串,实现了 IComparer<string> 接口
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<string>
接口,该接口定义了比较两个字符串的方法。CustomComparer
类中的 Compare
方法根据版本号的每个部分逐个比较,如果发现不同的部分,就返回比较结果;如果所有部分都相同,则比较字符串的长度。
- 主程序类:
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
实例。最后,通过循环遍历排序后的列表,并将每个元素输出到控制台。 使用自定义的比较器对版本号字符串进行排序,排序规则是按照版本号的每个部分逐个比较,优先比较较低级别的部分,如果所有部分相等,则比较字符串的长度。排序结果会按照版本号从小到大的顺序输出。