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# 文件名排序的更多相关文章

  1. Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)

    前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...

  2. Qt 自定义model实现文件系统的文件名排序

    前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...

  3. Windows资源管理器文件名排序

    Windows资源管理器文件名排序 Windows资源管理器文件名排序 背景:自然排序 什么是自然排序? 怎样按自然排序的规则进行排序? 基于Python的解决方案 参考材料 这学期担任了本科生教学助 ...

  4. 【旧文章搬运】ntfs中的文件名排序规则~

    原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...

  5. python下使用sort()函数对目录下文件名进行多条件排序

    目录 1.基础函数 2.例子解析 参考 1.基础函数 a.sort()函数 sort()函数的作用是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表. lists =[1, 5, 1 ...

  6. python中获取指定目录下所有文件名列表的程序

    http://blog.csdn.net/rumswell/article/details/9818001 # -*- coding: utf-8 -*-#~ #------------------- ...

  7. C#文件和文件文件夹按时间、名称排序-顺序与倒序

    对于文件和文件夹有多种排序方式,常用的就是按创建或修改时间.按文件名排序.在 C# 中,按时间和文件名排序都十分简单,用数组提供的排序方法 Array.Sort() 一行代码就可以搞定,当然也可以用常 ...

  8. sort 树 hash 排序

    STL 中 sort 函数用法简介 做 ACM 题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的 O(n^2) 排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错. ST ...

  9. STL中vector的赋值,遍历,查找,删除,自定义排序——sort,push_back,find,erase

    今天学习网络编程,那个程序中利用了STL中的sort,push_back,erase,自己没有接触过,今天学习一下,写了一个简单的学习程序.编译环境是VC6.0         这个程序使用了vect ...

随机推荐

  1. NSRange 范围

    前言 结构体,这个结构体用来表示事物的一个范围,通常是字符串里的字符范围或者集合里的元素范围. typedef struct _NSRange { NSUInteger location; // 表示 ...

  2. 【bzoj4709】[Jsoi2011]柠檬 决策单调性+dp

    Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...

  3. Java面向对象之多态(成员访问特点) 入门实例

    一.基础概念 多态的调用方式在子父类中的特殊体现. 1.访问成员变量特点: 当子父类中出现同名成员变量时. 多态调用时,编译和运行都参考引用型变量所属的类中的成员变量. 即编译和运行看等号的左边. 2 ...

  4. 消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?

    最近要为公司的消息队列中间件进行选型,市面上相关的开源技术又非常多,如ActiveMQ.RabbitMQ.ZeroMQ.Kafka,还有阿里巴巴的RocketMQ等. 这么多技术,如何进行选型呢? 首 ...

  5. 1.线性回归、Logistic回归、Softmax回归

    本次回归章节的思维导图版总结已经总结完毕,但自我感觉不甚理想.不知道是模型太简单还是由于自己本身的原因,总结出来的东西感觉很少,好像知识点都覆盖上了,但乍一看,好像又什么都没有.不管怎样,算是一次尝试 ...

  6. np.random.seed(0)的作用:作用:使得随机数据可预测。

    >>>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55,  0.72,  0.6 ,  0.54]) > ...

  7. DIV做的Table

    <style> div.table{ border:1px solid #d7d7d7; margin-left:0px; border-bottom-width:; width:1200 ...

  8. echart使用与后台交互

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. VIA格式转COCO格式

    VIA是一款很好用的标注软件,基于网页,不过现在开源的大多数目标检测器都是基于COCO训练和测试的,我们如果想要训练自己的数据集,要么修改源代码,要么将自己的标注格式改成COCO格式,采用第一种方法很 ...

  10. JavaWeb学习笔记(三)—— Servlet

    一.Servlet概述 1.1 什么是Servlet Servlet是是sun公司提供一套规范(接口),是JavaWeb的三大组件之一(Servlet.Filter.Listener),它属于动态资源 ...