自然排序的IComparer

8

我已经寻找了一段时间解决这个问题的方法。

当我使用字符串排序对下面的列表进行排序时,我得到了以下结果:

10
10b
1111
1164
1174
23
23A
23B
23D
23E

我真的希望列表是:

10
10b
23
23A
23B
23D
23E
1111
1164
1174

一个数字排序也不能胜任此工作。

为什么数字排序不能胜任这项工作? - lahsrah
6
请查看 http://www.codeproject.com/KB/string/NaturalSortComparer.aspx。 - Glory Raj
@pratapchandra - 你应该把你的评论变成正式的答案。 - Jagd
@Jagd,我已经完成了,希望这能帮助到OP...... - Glory Raj
3个回答

4
如果您使用LINQ,可以使用OrderBy
Regex digitPart = new Regex(@"^\d+", RegexOptions.Compiled);
...
myList.OrderBy(x => int.Parse(digitPart.Match(x).Value))

3
对我而言有效,但我必须将 Integer.Parse 改为 Int32.Parse,并且.value 应大写。语法,一般般... - Jagd
@Jagd:糟糕:P 我是VB.NET开发者,那里用的是“Integer”。 - Ry-
从问题中并不清楚OP是否想要一个完整的自然搜索,该搜索还会按照"A1"、"A2"、"Bumblebee"的顺序排序。 - Jon Hanna
@minitech - 哦,傻了。我应该意识到这一点!拍头 :) - Jagd

3

3
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class NumStrCmp : IComparer<string> {
    public int Compare(string x, string y){
        Regex regex = new Regex(@"(?<NumPart>\d+)(?<StrPart>\D*)",RegexOptions.Compiled);
        var mx = regex.Match(x);
        var my = regex.Match(y);
        var ret = int.Parse(mx.Groups["NumPart"].Value).CompareTo(int.Parse(my.Groups["NumPart"].Value));
        if(ret != 0) return ret;
        return mx.Groups["StrPart"].Value.CompareTo(my.Groups["StrPart"].Value);
    }
}

class Sample {
    static public void Main(){
        var data = new List<string>() {"10","10b","1111","1164","1174","23","23A","23B","23D","23E"};
        data.Sort(new NumStrCmp());
        foreach(var x in data){
            Console.WriteLine(x);
        }
   }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接