2016-04-02 6 views
2

ディレクトリ内のファイルのソートされたリストを取得しようとしています。このファイルには異なる拡張機能があります。C#拡張子のない名前でDirectory.GetFiles()をソート

foreach (String File in Directory.GetFiles(directory, "*").OrderBy(f => f)) 
{ 
stringA[i] = File; 
i++; 
} 

問題は、私が期待したように結果がソートされないということです。この私が、 "stringA" でobteinです:

1.txt 
10.txt 
11.png 
12.png 
18.png 
19.txt 
2.txt 
21.png 
22.png 
23.png 
24.png 
25.txt 
26.txt 
27.txt 
28.txt 
29.txt 
3.png 
30.txt 
31.txt 
32..png 
33..png 
34..png 
35.png 
4.txt 
40.txt 
41.png etc 

私が欲しいものがある:1.TXT、2.txt、3.png、4.txt、5.png、6.txt、7、8、 9,10,11,19,20,21,29,30 ...

どうすればよいですか?

+0

あなたが使用している技術にタグを付けてください。 'java''c#'またはそれ以外のどれか? –

+0

C#。申し訳ありませんが、タグについて忘れました。 –

+0

ファイルはこの例のように数字のラベルが付けられていますか? –

答えて

0

これは、英数字ソートと呼ばれます。一般的にカスタムソートを行うには、必要に応じたカスタム比較メソッドを使用してIComparerインターフェイスを実装します。

英数字の場合、Dotnetpearlsは優れた例と実装を持っています:http://www.dotnetperls.com/alphanumeric-sorting

コピーAlphanumComparatorFastクラスは、このようにそれを使用します。

 var list = Directory.GetFiles(directory); 
     Array.Sort(list, new AlphanumComparatorFast()); 
+0

ありがとう!今それは働いている! –

+0

お寄せいただきありがとうございます。あなたが気にしないなら、それを受け入れる答えの左側のチェックマークを押すことを覚えておいてください;-)。 – Stokke

2
var files = Directory.GetFiles(directory, "*") 
     .Select(file => new { FileName = file, FileNumber = long.Parse(Path.GetFileNameWithoutExtension(file)) }) 
     .OrderBy(data => data.FileNumber); 

foreach(file in files) 
{ 
    Console.WriteLine("{0} (Number: {1})", file.FileName, FileNumber) 
} 

これはあなたが必要とするかもしれハンドリングエラーを省略していることに注意してください。

関連する問題