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 ...
随机推荐
- stegsolve的功能
- apache2.4配置
首先修改httpd.conf配置文件. vim conf/httpd.conf 添加: Listen 1234 然后把 # Virtual hosts #Include conf/extra/ ...
- 2018数学建模A题优秀论文:高温作业专用服装设计
高温作业专用服装设计 摘 要 本文针对多层材料的高温作业服装的传热问题进行研究,综合考虑多种传热方式建立传热模型,并以此模型为基础解决了服装设计中各层材料最佳厚度的问题. 对于问题一,要求在热物性系数 ...
- Python变量类型的强制转换
当我们需要对数据的类型转换时,只需要将数据类型作为函数名即可. 下面给出的函数可以执行数据类型之间的转换,函数返回一个新的对象,表示转换的值 函数格式 使用示例 描述 int(x [,base]) i ...
- linux vmalloc和kmalloc
kmalloc是内核低端内存的分配,而vmalloc对应内核高端内存的分配.kmalloc()分配的内存处于3GB-high_memory之间,这一段内核空间与物理内存的映射. kmalloc保证分配 ...
- hdu 6196 搜索+剪枝
Today, Bob plays with a child. There is a row of n numbers. One can takes a number from the left sid ...
- Spring学习笔记(二)——Spring相关配置&属性注入&Junit整合
一.Spring的相关配置 1.1 Bean元素 class属性:被管理对象的完整类名 name属性:给Bean起个名字,能重复,能使用特殊字符.后来属性 id属性:给Bean起个名字,不能重复,不能 ...
- class __init__()
python 先定义函数才能调用 类是客观对象在人脑中的主观映射,生产对象的模板,类相当于盖房的图纸,生产工具的模具 模板 类:属性.方法 __init__() 这个方法一般用于初始化一个类但是 当实 ...
- 蠕虫Worm virus
美国CORNELL大学研究生莫里斯编写的蠕虫病毒 蠕虫病毒是一种常见的计算机病毒.它是利用网络进行复制和传播,传染途径是通过网络和电子邮件.最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上 ...
- AMD、CMD/AMD与CMD的区别
http://blog.csdn.net/jackwen110200/article/details/52105493