2011-01-24 6 views
14

私はこのようなリストがあります:私はl.Sort(呼び出す場合数値文字列のリストをソート(1,2、...、9,10の代わりに、1,10,2)

var l = new List<string> {"bla 1.txt","bla 2.txt","bla 10.txt","bla 3.txt"}; 

を)、リストは純粋な文字列の観点からは意味をなさないが、User Perspectiveからは吸うという順序で並べ替えられます(1,10,2,3)。

ユーザーに01,02,03の名前を付けることを強制したくない/できないので...組み込みの方法や数字を正しく検出して並べ替える簡単なアルゴリズムがあるのだろうか私は1,2,3,10を持っていますか?数字は長さが1〜2文字(つまり99以下)なので、1桁の数字に0とソートを一時的に付加する正規表現を行うこともできますが、 ?

.NET 3.5SP1ことが重要ならば、ない4.0

+1

関連性があります。http://stackoverflow.com/questions/1022203/sorting-strings-containing-numbers-in-a-user-friendly-way – VoodooChild

+0

重複したhttp://stackoverflow.com/ q/248603/24874 –

答えて

20

最善のアプローチは、IComparerを利用しています。これは既に行われており、found on code projectにすることができます。

+1

+1 ...または既存のソリューションを使用 –

+0

私は過去にこの同じソリューションを使用しました。 – Pwninstein

+1

私は既存のテスト済みのソリューションが好きです - 魅力的な作品です! NumericComparer.csを取り除き、Compare関数をStringLogicalComparerに移動し、Compare(文字列、文字列)を非静的にし、クラスにIComparer、IComparerを実装させます。

0

入力( "bla1.txt")で正規表現を使用し、その値をintに変換し、その解析された値の比較を実行する独自のIComparerを実装できます。

10

文字列から数字を抽出するようなものを書いてみませんか?

// Note: This could very well be a bad implementation. I'm not too great with Regex. 
static int ExtractNumber(string text) 
{ 
    Match match = Regex.Match(text, @"(\d+)"); 
    if (match == null) 
    { 
     return 0; 
    } 

    int value; 
    if (!int.TryParse(match.Value, out value)) 
    { 
     return 0; 
    } 

    return value; 
} 

次に、あなたが使用してリストを並べ替えることができます:

list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y))); 

これはかなり非効率的なとして私を打つが、それは、少なくとも機能でなければなりません。