IComparer实现文件名排序

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

一、概要

本文主要分享在文件对象处理中需要根据文件名排序思路。主要基于.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.运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebService基于SoapHeader实现安全认证[webservice][.net][安全][soapheader]

WebService基于SoapHeader实现安全认证 本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用&#xff0c;如果是WebService建议使用WSE3.0来保护Web服务&#xff0c;如果使用的是Viaual Studio 2008可以使用WCF&#xff0c;WCF里面提供了更多的服务认证方法。以下提…

Java 常见的 30 个误区与细节!

1 在Java中&#xff0c;没有goto语句。因为大量使用goto语句会降低程序的可读性和可维护性&#xff0c;所以Java语言取消了goto的使用。同时&#xff0c;为了避免程序员自行使用goto所带来的混乱&#xff0c;Java语言仍将goto定义为一个关键字&#xff0c;但是没有定义任何语…

信息技术上册教案了解计算机,信息技术上册全册教案

信息技术上册全册教案[课时]:1节课[教学内容]:认识媒体;认识多媒体[教学目标]:1、了解媒体的概念和分类&#xff0c;理解多媒体的内涵和特征。2、能从日常的生活和学习中感受各种媒体及其作用3、培养学生对媒体、多媒体的喜爱&#xff0c;引发他们继续学习的热情。[教学重、难点…

轻量级NuGet—BaGet

1. 介绍BaGet是一个轻量级的包管理服务。有些时候公司或者个人不希望某一些包进行公开&#xff0c;那么就需要使用私有的包管理服务程序&#xff0c;该服务是用.netcore进行编写的(感谢开发者为.NET社区做出的贡献)Github&#xff1a;https://github.com/loic-sharma/BaGet官网…

为什么这个SQL Server DBA学习PowerShell--SQL任务

我开始学习PowerShell&#xff0c;是因为我在寻找一种快速和高效的方式收集有关我的SQL Servers的信息和更好地管理我的服务器工作负载的方式。我以为&#xff0c;我正在学习是另一门新的脚本语言&#xff0c;它能帮我做到前面提到的设想。实际上&#xff0c;我发现学习 PowerS…

30张地图看懂世界格局,用大数据说话

摘要&#xff1a;世界那么大&#xff0c;要了解的数据那么复杂&#xff0c;下面知识探索小编帮您总结一下关于世界的数据。1、 世界人口聚居地红色越深人口密度越大&#xff1b;灰色代表无人地带。2、全球各国平均智商分布图颜色越浅智商越高3、全球冰川融化后的世界地图4、全世…

.NET Core3.1 Dotnetty实战教程

Dotnetty实战系列视频由于在.net的环境当中对dotnetty相关资料相对较少&#xff0c;所以这里主要分享一个dotnetty使用教程希望能帮助到正在使用这套框架的开发者们。虽然这套框架已微软官方已经不在维护&#xff0c;但是这套框架里的设计是相当不错的通过阅读源码能学习到很多…

计算机u打字,win7电脑打字打不出来怎么办

在windows电脑当中&#xff0c;必不可少的一个操作就是打字了&#xff0c;输入代码需要打字&#xff0c;网页中搜索也需要打字&#xff0c;网络聊天也需要打字&#xff0c;不过最近有位win7系统用户&#xff0c;在电脑中打开浏览器&#xff0c;输入想要找的资料的时候&#xff…

我用Python爬取了14年所有的福彩3D信息,彩民们,只能帮你们到这了

作者|丁彦军来源|恋习Python前两天&#xff0c;在网上看到一个有意思的问题&#xff1a;彩票预测靠谱么&#xff1f;为什么还有那么多的人相信彩票预测&#xff1f;暂且不说&#xff0c;彩票预测是否靠谱&#xff1f;彩票预测也分人而异&#xff0c;江湖上骗术很多&#xff0c;…

C#: 8.0 和 9.0 常用新特性

在《带你了解C#每个版本新特性》 一文中介绍了&#xff0c;C# 1.0 到 7.0 的不同特性&#xff0c;本文接着介绍在 8.0 和 9.0 中的一些常用新特性。C# 8.0在 dotNET Core 3.1 及以上版本中就可以使用 C# 8 的语法&#xff0c;下面是 C# 8 中我认为比较常用的一些新功能。默认接…

选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...

工具&#xff1a;通达信金融终端使用方法&#xff1a;1、通达信软件界面2、点击“功能”“公式系统”“公式管理器”“条件选股公式”“其他类型”&#xff0c;点击新建3、使用选股公式&#xff0c;点击ctrlt&#xff0c;弹出条件选股窗口4、选中公式&#xff0c;点击加入条件&…

小米 华为都要造车?.NET高薪潮来了!(附招聘链接)

近期网络沸沸扬扬的小米、华为、苹果 都要造车&#xff0c;其实百度、阿里和腾讯 也都入局了。互联网大佬们纷纷开始造车&#xff0c;跟我们小小程序员有关系吗&#xff1f;有&#xff01;高薪机会来了&#xff0c;尤其是WPF&#xff01;且听下文分解。物联网终极形态“互联网”…

聚类算法学习指南(二)

http://hi.baidu.com/catfool/blog/item/c06bec3931a0efcad4622524.html 聚类算法学习指南&#xff08;二&#xff09;2009-05-06 20:49下图图 3-1 聚类方法的分类示意图3.1 传统聚类算法3.1.1 层次方法层次法对给定的数据对象集合进行层次似的分解。按层次分解的形成方式&…

.NetCore跨域

描述浏览器安全策略上的安全限制可以有效阻止Ajax向另外的一个域server发起请求&#xff0c;这就是著名的同源策略&#xff0c;如何突破这种限制&#xff0c;可以使用CORS。public static void AddCommon(this IServiceCollection services){services.AddCors(options >{opt…

山东大学计算机非全上课,山东大学非全日制研究生上课方式

【导读】山东大学非全日制研究生上课方式。如今非全日制研究生考试已经与全日制一样&#xff0c;连考试内容和时间也都是一样。许多想要报考山东大学非全日制研究生的人员开始担心&#xff0c;非全日制研究生和全日制研究生的考试样了&#xff0c;那么上课方式会不会也是一样的…

【转载】可复用的FS

有很多朋友要求给出一个应用ESFramework的Demo&#xff0c;在前面介绍ESFramework支持的4层架构中&#xff08;回顾&#xff09;&#xff0c;有AS、FS、IRAS&#xff0c;其中FS的功能需求最简单&#xff0c;所以本文就给出一个FS实现示例。 FS主要用于管理功能插件&…

Git、GitHub、GitLab三者之间的联系以及区别

在讲区别以及联系之前先简要的介绍一下&#xff0c;这三者都是什么(本篇文章适合刚入门的新手&#xff0c;大佬请出门左转)1.什么是 Git?Git 是一个版本控制系统。版本控制是一种用于记录一个或多个文件内容变化&#xff0c;方便我们查阅特定版本修订情况的系统。以前在没有使…

zen服务器芯片,服务器版Zen处理器简直大杀器:32核64线程,8通道DDR4内存

拼 命 加 载 中 ...在这次的E3展会上&#xff0c;AMD除了公布RX 470/460显卡之外&#xff0c;还跟雷蛇发了一款支持VR的背包PC&#xff0c;使用了RX480显卡&#xff0c;处理器则是AMD的Zen&#xff0c;8核16线程&#xff0c;这还只是桌面版的&#xff0c;要知道Zen处理器最重要…

【赠书活动】优雅免费领书指南

快扶朕起来&#xff0c;我还要送书&#xff01;在上一期的赠书活动上结束后。超模君就吩咐小树包装好书籍&#xff0c;寄给获奖的模友们&#xff01;很多模友收到书籍都表示很不错&#xff0c;期望能再来一次赠书活动。这不&#xff0c;朕又想&#xff0c;超模君又想送书了&…

利用11行Python代码,盗取了室友的U盘,内容十分刺激!

作者&#xff1a;Python新世界 來源&#xff1a;简书https://www.jianshu.com/p/3d7b2d9fe679序言那个猥琐的家伙整天把个U盘藏着当宝&#xff0c;都睡觉了就拿出来插到电脑上。我决定想个办法看他U盘里都藏了什么&#xff0c;直接去抢U盘是不可能的&#xff0c;骗也是…