FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ファイル名のソート

 System.IOのDirectoryクラス等を使用すると、指定したディレクトリ以下にあるファイル名やディレクトリ名を取得することができますが、その時得られるファイル名の順番は保障されていません。
 取得したファイル名を名前順に並べ替えたいと思うことは結構あることだと思います。この時、普通にソートを行うと自分が期待していた順番にならないことがあります。
 それはファイル名が文字列+数値で構成されている場合です。この場合、通常のソートでは数値も文字列として扱うので、数値順に並んでくれません。(file1, file2, file20, file3みたいな感じでfile2の次にfile20がきたりします)
 これを数値を考慮して並べ替える方法を紹介します。タイトルはファイル名のソートとなっていますが、ファイル名に限らず、文字列をソートする場合にも勿論使えます。

 まず、文字列を数値を考慮して並べ替える処理ですが、shlwapi.dllのStrCmpLogicalWを使用します。
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace FileNameSort
{
    public class LogicalComparer : IComparer<string>
    {
        // 並び順は昇順になる
        public int Compare(string x, string y)
        {
            return NativveMethods.StrCmpLogicalW(x ?? "", y ?? "");
        }

        internal static class NativveMethods
        {
            [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
            public static extern int StrCmpLogicalW(string psz1, string psz2);
        }
    }
}
 shlwapi.dllのStrCmpLogicalWを使用して、2つの文字列を比較しているだけです。
 StrCmpLogicalWに文字列を渡す時にx ?? ""としていますが、これは引数がnullの場合は空文字にしているだけです。
 この例では文字列は昇順で並べ替えられます。(並び順を降順にしたい場合は、StrCompLogicalWの結果に-1を掛けて反転させればOKです。)

 では、適当な文字列を並び替えてみましょう。以下のコードでは、通常のソートの場合とここで作成したLogicalComparerを使用した場合とを比較しています。
using System;
using System.Linq;

namespace FileNameSort
{
    class Program
    {
        static void Main(string[] args)
        {
            var fileNames = new[] { "file2", "file1", "file10", "file21", "file3" };

            Console.WriteLine("通常のソート");
            var nomalSorted = fileNames.OrderBy(x => x);
            foreach(var name in nomalSorted)
            {
                Console.WriteLine(name);
            }

            Console.WriteLine();
            Console.WriteLine("LogicalComparerを使用した場合");
            var fileNameSorted = fileNames.OrderBy(x => x, new LogicalComparer());
            foreach(var name in fileNameSorted)
            {
                Console.WriteLine(name);
            }

            Console.ReadLine();
        }
    }
}
 この結果は以下の様になります。
ソート結果
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。