↑↑↑ 点击左上角蓝字关注我,为您提供技术新动态。

一、概要

本文主要分享在文件对象处理中需要根据文件名排序思路。主要基于.net框架内提供的IComparer对象,它主要将定义类型为比较两个对象而实现的方法。

二、详细内容

1.场景

在读取文件列表的时候,会遇到各种各样的文件名例如“xxx-01”,"1xx01-13"希望按照数字的大小进行排序;可是一旦文件名中出现了符号那么排序就不能用List集合提供Sort方法的常规排序规则了。这时候就会出现文件名顺序乱掉的情况。这个时候我们就需要重新定义这个排序规则了。那么刚好IComparer就可以支持我们来解决这个问题。

2.实现

IComparer的实现

public class FilesNameComparer<T> : IComparer<T>
{public int Compare(T x, T y){if (x == null || y == null)throw new ArgumentException("Parameters can't be null");//对比文件对象A的文件名string fileA = x.ToString();//对比文件对象B的文件名string fileB = y.ToString();//将文件名里的字符一个个拆成字符数组char[] arr1 = fileA.ToCharArray();char[] arr2 = fileB.ToCharArray();int i = 0, j = 0;//逐字符处理while (i < arr1.Length && j < arr2.Length){if (char.IsDigit(arr1[i]) && char.IsDigit(arr2[j])){string s1 = "", s2 = "";while (i < arr1.Length && char.IsDigit(arr1[i])){s1 += arr1[i];i++;}while (j < arr2.Length && char.IsDigit(arr2[j])){s2 += arr2[j];j++;}if (int.Parse(s1) > int.Parse(s2)) return 1;if (int.Parse(s1) < int.Parse(s2)) return -1;}else{if (arr1[i] > arr2[j]) return 1;if (arr1[i] < arr2[j]) return -1;i++;j++;}}if (arr1.Length == arr2.Length){return 0;}else{return arr1.Length > arr2.Length ? 1 : -1;}}
}

FileModel的实现

public class FileModel
{public string Name { get; set; }public override string ToString(){return Name;}
}

调用

var comparer = new FilesNameComparer<FileModel>();
List<FileModel> fileList = new List<FileModel>();
fileList.Add(new FileModel { Name = "100-1" });
fileList.Add(new FileModel { Name = "1" });
fileList.Add(new FileModel { Name = "101-1" });
fileList.Add(new FileModel { Name = "101-2" });
fileList.Add(new FileModel { Name = "100-2" });
fileList.Add(new FileModel { Name = "102-3" });
fileList.Add(new FileModel { Name = "110-1" });
fileList.Add(new FileModel { Name = "20-1" });
fileList.Sort(comparer);
foreach (var s in fileList)
{Console.WriteLine(s.Name);
}

3.运行效果

IComparer实现文件名排序相关推荐

  1. java 按照拼音排序,java按照文件名排序,中文按拼音字母排序

    java按照文件名排序,中文按拼音字母排序 import java.io.File; import java.text.Collator; import java.util.ArrayList; im ...

  2. java 文件名排序_Java笔记:像win里一样文件名排序

    *********************************************** *月球正一日一日远离TA的亿年CP,* *而遥远^遥远的仙女却向往璀璨的银河!"* ***** ...

  3. 【2018.5.19】模拟赛之二-ssl2433 文件名排序【字符串】

    正题 大意 一些文件名,有的有后缀,有的没有. 现在要求(先满足前者) 1. 没有后缀的排最后 2. 后缀字典序 3. 名字字典序 解题思路 首先按后缀排序如果后缀一样就名字排序,然后两次枚举先搞定有 ...

  4. python pitfall (陷阱)--不同平台os模块文件名排序

    2019独角兽企业重金招聘Python工程师标准>>> 标题取的太大了,但只先记录一点,说明python os模块在不同平台下不同的行为.可能以后会添加,主要为抛砖引玉... 环境: ...

  5. matlab dir 自然排序,自然顺序文件名排序【含Matlab源码】

    字母数字形式的文件名或文件路径,具有可自定义的数字格式. 字符串单元格数组的字母数字排序(1xN个字符).考虑到字符串中出现的任何数字子字符串的值,对字符串进行排序.比较例如: >> A ...

  6. linux文件名排序规则,Linux sort 排序使用详解

    前阵子,写脚本时,用到sort来对文件排序:第一次没有达到所需的效果,原来是LANG设置问题,后来先export LANG=C,然后再sort就满足我的要求了. 某牛人总结的sort用法:http:/ ...

  7. Linux文件名排序

    需求 文件夹下面有很多以数字命名的png文件,现需使用ll命令列出所有文件(只要文件名),并且按照数字从小到大进行排序. 命令 ls -l | awk '{print $9}' | sort -k1. ...

  8. linux按文件名排序ls,linux – 如何使用shell脚本按名称对文件进行排序

    我想用 Shell脚本按日期排序所有文件. 例如,在/ Users / KanZ / Desktop / Project / Test /中有文件M1.h,A2.h和F4.h. 每个文件都有不同的时间 ...

  9. 织梦后台对应的php文件,织梦DedeCMS后台文件列表按文件名排序的方法

    织梦dede系统的后台文件, 默认的排序很乱, 不是按名称, 也不是按时间, 如果目录内容很多的话, 很难找到自己想要的文件: 实在是太不方便了, 于是想让这些文件列表按名字排序, 看了一下后台的文件 ...

最新文章

  1. 深度学习核心技术精讲100篇(七十五)-集成学习
  2. 文献学习(part15)--Subspace Clustering via Good Neighbors
  3. 如何更合理地选择图表形式
  4. MY WAY程序(十八) 团队开发
  5. java excel api 下载文件_Java-Excel Java操作Excel POI(Jakarta POI API) - 下载 - 搜珍网
  6. 【动态规划】leetcode 53:最大子数组和
  7. 使用Flutter开发一个仿微信飞机大战游戏
  8. 用计算机弹让我做你的眼睛,童珺 - 让我做你的眼睛 (改编版)-酷歌词...
  9. 灌浆料的弹性模量计算_防城港市(灌浆料)月度
  10. 如何记忆 Spring Bean 的生命周期
  11. nps内网穿透工具学习
  12. 轻松编写您自己的拖拉机算法,进行算法大战
  13. 关于C语言编译的可执行文件 exe 发给好友解决办法 Visual Studio 2013 版本
  14. 有的放矢,Liferay进军数字体验市场
  15. 投资理财--熊市笨小孩式交易75-25
  16. 教你怎么批量查询快递单号,一学就会
  17. C语言中 “>>=,<<=,=,^=,|=” 分别表示什么意思? 举例说明
  18. October 2006
  19. 膨胀卷积的缺点_膨胀卷积学习笔记
  20. git基于某个Tag修改提交

热门文章

  1. jquery|javascript 回车事件
  2. 6款国内外SNS开源软件 搭建社交网站利器
  3. zabbix4.2 系列(二):agent配置
  4. 思科AP-什么是COS AP?
  5. 10_30_unittest
  6. Integer源码解析
  7. Error opening terminal: xterm-256color
  8. 【APP接口开发】常用HTTP响应头状态码详解
  9. cf769D(枚举位或运算)
  10. stm32串口通讯问题