情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

LINQでファイルを開くダイアログのフィルタ文字列を1行で作る

今までで一番複雑なLINQを使った1文になったのでメモ。

まず、ファイルタイプを表すクラスを定義します。

public class FileType
{
    public FileType()
    {
    }

    private string name = null;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    private List<string> extensions = null;
    public List<string> Extensions
    {
        get
        {
            return extensions;
        }
        set
        {
            extensions = value;
        }
    }
}

適当なタイルタイプのリストからフィルタ文字列を作ります。

//適当なファイルタイプのリスト
List<FileType> fileType = new List<FileType>() { new FileType(){ Name = "AVIファイル", Extensions = new List<string>() { ".avi" }},
                                                 new FileType(){ Name = "MOVファイル", Extensions = new List<string>() { ".mov", ".qt" }},
                                                 new FileType(){ Name = "WMVファイル", Extensions = new List<string>() { ".wmv" }},
                                                 new FileType(){ Name = "FLVファイル", Extensions = new List<string>() { ".flv" }},
                                                 new FileType(){ Name = "MPGファイル", Extensions = new List<string>() { ".mpg", ".mpeg", ".m1v", ".m2v" }},
                                                 new FileType(){ Name = "MP4ファイル", Extensions = new List<string>() { ".mp4", ".m4v", ".m4a" }},
                                                 new FileType(){ Name = "MKVファイル", Extensions = new List<string>() { ".mkv" }},
                                                 new FileType(){ Name = "TSファイル", Extensions = new List<string>() { ".ts", ".m2ts" }},
                                                 new FileType(){ Name = "WAVファイル", Extensions = new List<string>() { ".wav" }},
                                                 new FileType(){ Name = "WMAファイル", Extensions = new List<string>() { ".wma" }},
                                                 new FileType(){ Name = "MP3ファイル", Extensions = new List<string>() { ".mp3" }}, };

//フィルタ文字列を作成
string filter = (from f in fileType let e = f.Extensions.Aggregate("*", (w, n) => w + (w == "*" ? "" : (";" + "*")) + n) select f.Name + "(" + e + ")" + "|" + e).Aggregate((w, n) => w + "|" + n) + "|" + "全てのメディアファイル(全ての種類)" + "|" + (from f in fileType select f.Extensions).Aggregate((w, n) => w.Union(n).ToList()).Aggregate("*", (w, n) => w + (w == "*" ? "" : (";" + "*")) + n) + "|" + "全てのファイル(*.*)|*.*";

//表示する
Console.WriteLine(filter);
Console.ReadLine();

結果は以下のようになります。

AVIファイル(*.avi)|*.avi|MOVファイル(*.mov;*.qt)|*.mov;*.qt|WMVファイル(*.wmv)|*.wmv|FLVファイル(*.flv)|*.flv|MPGファイル(*.mpg;*.mpeg;*.m1v;*.m2v)|*.mpg;*.mpeg;*.m1v;*.m2v|MP4ファイル(*.mp4;*.m4v;*.m4a)|*.mp4;*.m4v;*.m4a|MKVファイル(*.mkv)|*.mkv|TSファイル(*.ts;*.m2ts)|*.ts;*.m2ts|WAVファイル(*.wav)|*.wav|WMAファイル(*.wma)|*.wma|MP3ファイル(*.mp3)|*.mp3|全てのメディアファイル(全ての種類)|*.avi;*.mov;*.qt;*.wmv;*.flv;*.mpg;*.mpeg;*.m1v;*.m2v;*.mp4;*.m4v;*.m4a;*.mkv;*.ts;*.m2ts;*.wav;*.wma;*.mp3|全てのファイル(*.*)|*.*
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#, LINQ