【问题标题】:IComparer for natural sorting [duplicate]用于自然排序的 IComparer [重复]
【发布时间】:2012-01-24 00:25:57
【问题描述】:

我一直在寻找解决这个问题的方法。

当我使用字符串排序对以下内容进行排序时,我有一个列表:

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

我真的希望列表是:

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

数字排序也不行。

【问题讨论】:

标签: c# list sorting natural-sort


【解决方案1】:

最简单的方法是包装 Win32 API 调用,如 https://stackoverflow.com/a/248613/631687 中所述

【讨论】:

    【解决方案2】:

    如果你有 LINQ,你可以使用OrderBy:

    Regex digitPart = new Regex(@"^\d+", RegexOptions.Compiled);
    ...
    myList.OrderBy(x => int.Parse(digitPart.Match(x).Value))
    

    【讨论】:

    • 为我工作,但我不得不将 Integer.Parse 更改为 Int32.Parse,并且 .value 应该大写。语法,嗯...
    • @Jagd:哎呀:P 我是 VB.NET 人员,它的地址是 Integer
    • 从问题中不清楚 OP 是否想要一个完整的自然搜索,也可以按顺序排列“A1”、“A2”、“Bumblebee”。
    • @minitech - 哦,呵呵。我应该意识到这一点! 磕头 :)
    【解决方案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);
            }
       }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 2020-09-14
      • 2010-11-22
      • 2012-11-20
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多