c# 文件名排序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; namespace FileSort
{
class Program
{
//static void Main(string[] args)
//{
//} public enum CharType
{
Number = ,
Normal =
} public class Model
{
private string _oValue;
public string oValue
{
set { _oValue = value; }
get { return _oValue; }
} private CharType _cType;
public CharType cType
{
set { _cType = value; }
get { return _cType; }
} public Model(string o, CharType c)
{
_oValue = o;
_cType = c;
}
}
public class FileNameComparer1 : IComparer
{ public int Compare(object a, object b)
{
string s1 = a.ToString();
string s2 = b.ToString(); if (s1.IndexOf('.') == - && s2.IndexOf('.') == -)
{
return SubCompare(s1, s2);
} else if (s1.IndexOf('.') != - && s2.IndexOf('.') != -)
{
int pos1 = s1.IndexOf(".");
int pos2 = s2.IndexOf(".");
string ss1 = s1.Substring(, pos1);
string ss2 = s2.Substring(, pos2);
int result = SubCompare(ss1, ss2);
if (result == )
{
string is1 = s1.Substring(pos1 + );
string is2 = s2.Substring(pos2 + );
return SubCompare(is1, is2);
}
return result;
} else
{
int pos1 = s1.IndexOf(".");
int pos2 = s2.IndexOf(".");
return pos1 > pos2 ? : -;
}
} int SubCompare(string s1, string s2)
{
List<Model> q1 = null;
List<Model> q2 = null; q1 = StoreQueue(s1);
q2 = StoreQueue(s2);
if (q1 == null)
return -;
if (q2 == null)
return ; int len = q1.Count;
if (len > q2.Count)
len = q2.Count;
for (int i = ; i < len; i++)
{
if (q1[i].cType != q2[i].cType)
{
return q1[i].oValue[] > q2[i].oValue[] ? : -;
}
else
{
if (q1[i].oValue == q2[i].oValue)
{
continue;
}
if (q1[i].cType == CharType.Number)
{
if (q1[i].oValue != q2[i].oValue)
{
int num1 = int.Parse(q1[i].oValue);
int num2 = int.Parse(q2[i].oValue);
return num1 > num2 ? : -;
}
}
else
{
if (q1[i].oValue != q2[i].oValue)
{
int rlen = q1[i].oValue.Length;
if (rlen > q2[i].oValue.Length)
rlen = q2[i].oValue.Length;
for (int j = ; j < rlen; j++)
{
if (q1[i].oValue[j] != q2[i].oValue[j])
return q1[i].oValue[j] > q2[i].oValue[j] ? : -;
}
return q1[i].oValue.Length > q2[i].oValue.Length ? : -;
}
}
}
}
if (q1.Count != q2.Count)
return q1.Count > q2.Count ? : -;
else
return ;
} CharType GetCharType(char c)
{
if (c >= && c <= )
return CharType.Number;
else return CharType.Normal;
} public List<Model> StoreQueue(string str)
{ if (string.IsNullOrEmpty(str) || str.Length == )
{
return null;
} List<Model> sl = new List<Model>();
Model m = null;
CharType ctype = GetCharType(str[]);
if (str.Length == )
{
m = new Model(str, ctype);
sl.Add(m);
return sl;
}
int start = ;
for (int i = ; i < str.Length; i++)
{
if (GetCharType(str[i]) != ctype)
{
m = new Model(str.Substring(start, i - start), ctype);
sl.Add(m);
if (i == str.Length - )
{
CharType sType = GetCharType(str[i]);
m = new Model(str[i].ToString(), sType);
sl.Add(m);
}
else
{
ctype = GetCharType(str[i]);
start = i;
}
}
else
{
if (i == str.Length - )
{
CharType sType = GetCharType(str[i]);
m = new Model(str.Substring(start, i + - start), sType);
sl.Add(m);
}
}
}
return sl;
}
}
//for test
public static void Main(string[] args)
{
string[] filenames = new string[] { "IM1", "IM2", "IM3", "IM4", "IM5", "IM6", "IM7",
"IM8", "IM9", "IM10", "IM12", "IM11", "IM13", "IM20", "IM21", "IM22", "IM30", "IM100", "IM1000", "IM200", "IM234"};
Array.Sort(filenames, new FileNameComparer1());
foreach (string s in filenames)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}
}
c# 文件名排序的更多相关文章
- Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...
- Qt 自定义model实现文件系统的文件名排序
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...
- Windows资源管理器文件名排序
Windows资源管理器文件名排序 Windows资源管理器文件名排序 背景:自然排序 什么是自然排序? 怎样按自然排序的规则进行排序? 基于Python的解决方案 参考材料 这学期担任了本科生教学助 ...
- 【旧文章搬运】ntfs中的文件名排序规则~
原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...
- python下使用sort()函数对目录下文件名进行多条件排序
目录 1.基础函数 2.例子解析 参考 1.基础函数 a.sort()函数 sort()函数的作用是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表. lists =[1, 5, 1 ...
- python中获取指定目录下所有文件名列表的程序
http://blog.csdn.net/rumswell/article/details/9818001 # -*- coding: utf-8 -*-#~ #------------------- ...
- C#文件和文件文件夹按时间、名称排序-顺序与倒序
对于文件和文件夹有多种排序方式,常用的就是按创建或修改时间.按文件名排序.在 C# 中,按时间和文件名排序都十分简单,用数组提供的排序方法 Array.Sort() 一行代码就可以搞定,当然也可以用常 ...
- sort 树 hash 排序
STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...
- STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase
今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0 这个程序使用了vect ...
随机推荐
- 从程序员的角度深入理解MySQL
前言 今天我将站在程序员的角度以MySQL为例探索数据库的奥秘! 数据库基本原理 我对DB的理解 1.数据库的组成:存储 + 实例 不必多说,数据当然需要存储:存储了还不够,显然需要提供程序对存储 ...
- ES更改参数max_result_window
今天开发那边说翻页超过10000报错.早上来查阅官网手册,说from/size默认是10000.通过参数index.max_result_window进行控制.那么直接改这个参数即可. 1.先看看默认 ...
- uoj#344. 【清华集训2017】我的生命已如风中残烛(计算几何)
题面 传送门 题解 orzxyx 首先我们发现,一个点如果被到达大于一次,那么这个点肯定在一个环上.所以在不考虑环的情况下每个点只会被到达一次,那么我们就可以直接暴力了 简单来说,我们对每个点\(i\ ...
- 190221协程与IO模型
一.协程 又称微线程 协程是一种用户态的轻量级的线程 在单线程下实现的并发,例如:yield 优点: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销 方便切换控制流,简化编程模型 高并发,高扩 ...
- 洛谷 P1111 修复公路(最小生成树)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1111 这道题的关键是读懂题: 首先根据题中的一些扎眼的字眼我们可以判断这是一道用最小生成树来做的题 ...
- [o.e.b.ElasticsearchUncaughtExceptionHandler] [unknown] uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
这是因为不知从哪个版本后,elasticsearch为了安全性,是不能用root用户启动的. 解决的办法:当然是创建一个用户,用创建的用户启动啦,注意权限的问题,目录也应该改为创建的用户权限! 我是用 ...
- jQuery Validate验证框架详解(jquery.validate.min.js)
原博客 jQuery Validate验证框架详解 jQuery校验官网地址:https://jqueryvalidation.org/ 一.导入js库 <script type="t ...
- abp学习资料
参考: https://www.jianshu.com/p/a6e9ace79345
- HDU 6356 (线段树-l,r 之间小于val 的变val+单点求值)
题目描述: 给你一个长度为n的最开始为0的数以及m个更新操作以及数据生成器参数X,Y,Z.每次操作,将由数据生成器生成出li,ri,vi.让你从区间[li,ri]中,将所有小于vi的数变为vi.最后让 ...
- C# 判别系统版本以及Win10的识别办法
首先得知道操作系统和主次版本的对应关系 我们可以用Environment.OSVersion来判断当前操作系统 && Environment.OSVersion.Version.Min ...