C#对文件名智能排序的算法

作者:天方 时间:2022-05-02 16:18:28 

在文件夹中,我们经常有类似s_1.txt、s_2.txt、s_10.txt、s_11.txt这样的命名方式,我们期望的排序方式是s_1.txt、s_2.txt、s_10.txt、s_11.txt(Vista & Windows7是这种方式),然而,按照常规的字符串排序算法的到的结果是s_1.txt、s_10.txt、s_11.txt、s_2.txt(Windows XP是这种方式)。

要实现方式1所需要的智能排序效果,我们的排序算法需要满足如下规则:

  • 非数字部分按照字符串排序

  • 数字部分按照大小排序

  • 规则1的优先级高于规则2的优先级

这个规则看起来简单,但是实现起来却不是那么容易,因为我们的文件名没有太大的约束,许多文件名时多段式字符串和数字混合在一起的,文件名之间也没有规律可循。由于今天写个小程序的时候需要这种功能,我在网上找了一下,没有什么合适的通用算法,便自己写了一个(实际上写了好几个,这个是最满意的一个)。

算法的原理很简单。

  • 将字符串中的数字左侧填充0,变成定长的文件名。
    上述文件被命名为s_01.txt、s_02.txt、s_10.txt、s_11.txt

  • 将新文件名按照默认字符串排序算法排序

代码如下:

static Regex digitRegex = new Regex(@"\d+");
static string[] SmartSort(IEnumerable<string> files)
{
   //这里只传文件名,以避免不必要的开销,不同的文件夹的文件没有智能排序的必要
   var maxLength = files.Max(file => digitRegex.Matches(file).Cast<Match>().Max(num => num.Length));

var query = from file in files
               let sortFile = digitRegex.Replace(file, m => m.Value.PadLeft(maxLength, '0'))
               orderby sortFile
               select file;

return query.ToArray();
}

static void Main(string[] args)
{
   var files = Directory.GetFiles(@"R:\22").Select(i=>Path.GetFileName(i));

Console.WriteLine(string.Join("\r\n", SmartSort(files)));
}

这个算法可用于文件夹或同种类型的文件排序,对于不同的类型的文件的智能排序,还需要在linq查询的时候加上一个分组的功能,这里就懒得写了。

这个算法谈不上高效(这个算法只用来对一个文件夹下的所有文件排序,实际上也不存在什么效率问题),但却是我尝试的几种算法中最简单的一个,也是我最满意的一个,目前没有发现什么bug,如果谁有更合适的算法,欢迎指教。

来源:https://www.cnblogs.com/TianFang/archive/2009/12/05/1617769.html

标签:C#,文件名,智能,排序
0
投稿

猜你喜欢

  • Spark调优多线程并行处理任务实现方式

    2023-08-21 15:43:53
  • Java如何使用HTTPclient访问url获得数据

    2023-11-12 04:16:21
  • maven多个仓库查询的优先级顺序案例讲解

    2023-08-16 02:33:23
  • SpringBoot项目中分页插件PageHelper无效的问题及解决方法

    2021-07-08 23:25:55
  • springboot 项目启动后无日志输出直接结束的解决

    2023-05-25 02:28:21
  • java对象拷贝详解及实例

    2023-01-20 08:27:00
  • springboot自定义Starter过程解析

    2023-07-24 22:24:55
  • C++string中的insert()插入函数详解

    2023-11-02 14:05:51
  • 解决RestTemplate 请求url中包含百分号 会被转义成25的问题

    2022-11-01 22:59:51
  • 使用Flutter实现一个走马灯布局的示例代码

    2023-06-19 03:50:03
  • spring异步service中处理线程数限制详解

    2021-09-02 23:20:12
  • java利用递归算法实现对文件夹的删除功能

    2023-07-26 06:37:02
  • SpringBoot实现接口数据的加解密功能

    2023-06-30 00:11:01
  • springboot配置mysql数据库spring.datasource.url报错的解决

    2023-10-04 12:49:26
  • SpringBoot通过@Value实现给静态变量注入值详解

    2022-04-30 14:30:37
  • Java String源码分析并介绍Sting 为什么不可变

    2021-09-23 06:10:42
  • java 实现迷宫回溯算法示例详解

    2023-12-14 23:52:26
  • Java编程基础测试题分享

    2023-11-27 22:14:58
  • C++ Cmake的构建静态库和动态库详解

    2023-06-28 08:28:15
  • 教你如何使用Java输出各种形状

    2023-08-21 00:46:55
  • asp之家 软件编程 m.aspxhome.com