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 ...
随机推荐
- vi—终端中的编辑器
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 【BZOJ4555】[TJOI&HEOI2016]求和 斯特林数+NTT
Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i ...
- 【ExecutorService】概述
初试 今天做一个上传excel,后台异步导入数据功能,使用ExecutorService private final ExecutorService m_longPollingService; pub ...
- python基础之内建函数(二)
(7)max() 函数:返回列表.元祖或字符串中最大的元素,注意:字母“大于”数字.小写字母“大于”大写字母(字母排序是根据ASCII码表排的) 例如: >>>num = list ...
- iOS的本地推送删除不了解决方法
最近在研究苹果推送,当测试本地推送的时候,发现一个问题,就是一旦你添加了一个本地推动的通知,当你修改代码,删除应用,当你再次运行app,它还是会在横幅上面弹出推送,尼玛怎么搞都删除不了,近乎崩溃了,开 ...
- 选课 树形背包dp
题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...
- CodeCraft-19 and Codeforces Round #537 (Div. 2) C. Creative Snap 分治
Thanos wants to destroy the avengers base, but he needs to destroy the avengers along with their bas ...
- SQL语句之表操作
SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 写在前面 在上一篇博文里面我整理了“行”级别的操作,分别是“增(insert).删 ...
- django基础知识之Response对象
HttpResponse对象 在django.http模块中定义了HttpResponse对象的API HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 不调 ...
- python学习之路---day26
网络的基本知识点 一:网络通信原理 连接两台计算机之间的Internet之间的协议一系列协议为互联网协议 互联网协议的功能是:定义计算机如何接入Internet,以及Internet的计算机通信标准 ...