2011-12-19 7 views
7

私は今この解決策を探しています。自然分別のためのIComparer

私は、ソート文字列を使用して以下に並べ替える場合は、私がのリストがあります:私は本当にリストになりたい

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

を:

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

数値ソートは、どちらかの仕事をしていません。

+0

なぜ数値ソートではジョブが実行されないのですか? – lahsrah

+5

http://www.codeproject.com/KB/string/NaturalSortComparer.aspxをご覧ください。 –

+0

@pratapchandra - あなたのコメントを公式の回答にするだけです。 – Jagd

答えて

4

で説明したようにWin32 APIの呼び出しをラップすることです:

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

私のために働いたが、私はInteger.ParseをInt32.Parseに変更しなければならず、.valueは大文字にする必要があります。構文、meh ... – Jagd

+0

@Jagd:Oops:P私はVB.NETの人であり、そこには「整数」があります。 – Ryan

+0

OPから "A1"、 "A2"、 "Bumblebee"の順番で完全な自然検索が必要かどうかは疑問からは分かりません。 –

2

私は、このリンクの意志がnatural Sort Comparerを使用して自然なソートに役立ちます願っています

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); 
     } 
    } 
} 
関連する問題