排序有时候要考虑后缀。这样看起来比较自然。

参考了codeproject上一篇文章:http://www.codeproject.com/Articles/22978/Implementing-the-NET-IComparer-interface-to-get-a

然后自己写了个简单的,考虑到主要思想是上面那个文章上的,所以不做太多解释。代码如下:

 using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; namespace StringOrder
{
class Program
{
static void Main(string[] args)
{
string[] array = new string[] { "2.1", "2.001" }; string[] array2 = array.OrderBy(a => a, new StringCompare1()).ToArray();
Console.Read(); }
}
public class StringCompare1 : IComparer<string>
{
public int Compare(string x, string y)
{ StringParser sx = new StringParser(x);
StringParser sy = new StringParser(y);
while (sx.TokenType != StringParser.ETokenType.Nothing || sy.TokenType != StringParser.ETokenType.Nothing)
{
if (sx.TokenType == StringParser.ETokenType.Numberic && sy.TokenType == StringParser.ETokenType.Numberic)
{
return decimal.Compare(sx.DoubleValue,sy.DoubleValue);
}
if (string.Compare(sx.StringValue, sy.StringValue) != )
{
return string.Compare(sx.StringValue, sy.StringValue);
}
else
{
sx.NextToken();
sy.NextToken();
}
}
return ;
}
} public class StringParser
{
private string _value;
private char _curChar;
private int _curIndex = ;
private int _length;
private ETokenType _tokenType = ETokenType.Character;
public ETokenType TokenType { get { return _tokenType; } } private string _stringValue;
public string StringValue { get { return _stringValue; } } private decimal _doubleValue;
public decimal DoubleValue { get { return _doubleValue; } } public StringParser(string val)
{
_value = val;
_length = val.Length;
NextChar();
NextToken();
} public void NextToken()
{
if (_curChar == '\0')
{
_tokenType = ETokenType.Nothing;
_stringValue = null;
}
else if (char.IsDigit(_curChar))
{
int startIndex = _curIndex;
while (char.IsDigit(_curChar) || _curChar == '.')
{
NextChar();
}
string temp = _value.Substring(startIndex-, _length - startIndex+);
if (decimal.TryParse(temp, out _doubleValue))
{
_tokenType = ETokenType.Numberic;
}
else
{
_tokenType = ETokenType.Character;
}
_stringValue = temp;
}
else if (char.IsLetter(_curChar))
{
_tokenType = ETokenType.Character;
int startIndex = _curIndex;
while (char.IsLetter(_curChar))
{
NextChar();
}
_stringValue = _value.Substring(startIndex-,_curIndex-startIndex);
}
else
{
NextChar();
}
} private void NextChar()
{
if (_curIndex >= _length)
{
_curChar = '\0';
return;
}
else
{
_curChar = _value[_curIndex];
_curIndex += ;
} }
public enum ETokenType
{
Nothing,
Character,
Numberic,
}
}
}

另可参考:

http://www.codeproject.com/Articles/22175/Sorting-Strings-for-Humans-with-IComparer

感谢每一位阅读此篇文章的人,希望可以帮到你。

c#实现自然排序效果,按1,2,11而不是1,11,12,区分字母文字和数字的更多相关文章

  1. 如何在mysql中实现自然排序

    背景 熟悉mysql的同学应该清楚,mysql在对字符串做order by排序时是按照字典序进行排序的,但是如果字符串中包含数字的话(我们称这种类型的字符串为alphanumeric),仅按照字典序的 ...

  2. Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)

    1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...

  3. matlab对文件目录进行自然排序

    作者:tongqingliu 转载请注明出处: matlab对文件目录进行自然排序 比如我新建一个tmp文件夹,在该文件夹下新建以下txt文件进行测试 a1.txt a2.txt a3.txt a11 ...

  4. 什么是泛型?,Set集合,TreeSet集合自然排序和比较器排序,数据结构-二叉树,数据结构-平衡二叉树

    ==知识点== 1.泛型 2.Set集合 3.TreeSet 4.数据结构-二叉树 5.数据结构-平衡二叉树 ==用到的单词== 1.element[ˈelɪmənt] 要素 元素(软) 2.key[ ...

  5. Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)

    1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...

  6. Java基础知识强化之集合框架笔记44:Set集合之TreeSet保证元素唯一性和自然排序的原理和图解

    1. TreeSet保证元素唯一性和自然排序的原理和图解 2. TreeSet唯一性以及有序性底层剖析: 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法. 跟踪 ...

  7. Collections之sort的两个方法(自然排序和自定义比较器排序)

    Collections是个服务于Collection的工具类(静态的),它里面定义了一些集合可以用到的方法. 本文演示了Collections类里sort()的两个方法.第一种只需传入被排序的集合,便 ...

  8. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)

    pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...

  9. TreeSet集合排序方式一:自然排序Comparable

    TreeSet集合默认会进行排序.因此必须有排序,如果没有就会报类型转换异常. 自然排序 Person class->实现Comparable,实现compareTo()方法 package H ...

随机推荐

  1. bootstrap-paginator分页插件的两种使用方式

    分页有两种方式: 1. 前台分页:ajax一次请求获取全部数据,适合少量数据(万条数据以下): $.ajax({ type: "GET", url: "",// ...

  2. 【Java学习笔记之二十三】instanceof运算符的用法小结

    instanceof运算符用法 运算符是双目运算符,左面的操作元是一个对象,右面是一个类.当左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false 说明: (1)一个类的实例 ...

  3. POJ 3154 Graveyard【多解,数论,贪心】

    Graveyard Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1707   Accepted: 860   Specia ...

  4. python学习之总结

    迭代器: def gen(): a = 100 yield a a = a * 8 yield a yield 1000 for i in gen(): print(i) 创建一个函数,循环体,yie ...

  5. Android源码博文集锦3

    Android精选源码 android实现最简洁的标签(label/tag)选择/展示控件   懂得智能配色的ImageView,还能给自己设置多彩的阴影哦   NicePhoto-基于 Kotlin ...

  6. linux下各文件夹的结构说明及用途介绍

    linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令.   /dev:设备特殊文件.   /etc:系统管理和配置文件.   /etc/rc.d:启动的配 置文件和脚本.   /ho ...

  7. Java简历与面试

    尊重原创:http://blog.csdn.net/love_java_cc/article/details/78292347 Java就业指导   想要成为合格的Java程序员或工程师到底需要具备哪 ...

  8. SSL和SSH有什么区别

    SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性.SSL 使应用程序在通信时不用担心被窃听和篡改. SSL 实际上 是共同工作的两个协议:"SSL 记录协议"(SSL ...

  9. Git学习(2)-使用Git 代码将本地文件提交到 GitHub

    上次随笔写到git的安装和运用命令窗口创建本地版本库,这次主要讲一下用git代码将本地文件提交到GitHub上. 前提是有一个GitHub账号. 1.创建一个新的版本库,进入到你本地项目的根目录下(我 ...

  10. ios 一步一步学会自定义地图吹出框(CalloutView)-->(百度地图,高德地图,google地图)

    前言 在 ios上边使用地图库的同学肯定遇到过这样的问题:吹出框只能设置title和subtitle和左右的view,不管是百度地图还是高德地图还是自带的 google地图,只提供了这四个属性,如果想 ...