業務のためのC#・C言語・C++学習

主にC#の文法やWPF周りのアウトプットに利用してます。

【C#】ディレクトリパスを指定しフォルダ名をreturnするメソッド

自分も含めてですが、何かしらの文字列を入れた配列やコレクションをreturnするメソッドを書く場合、とりあえず処理した各要素を保存するインスタンス変数を作りがちです。 例えばこんな感じに。
DirectoryInfoクラスを利用しディレクトリの情報からファイル名を取得します。
*エラー処理は省略

    public List<string> ReturnData()
        {       
            string path = @"";
            DirectoryInfo diInfo = new DirectoryInfo(path);
            DirectoryInfo[] diInfomations = diInfo.GetDirectories();

   List<string> data = new List<string>();
            foreach (var directions in diInfomations)
            {
                data.Add(directions.Name);
            }
            return data;
        }

DirectoryInfoクラスのオブジェクトを作りディレクション情報をDirectoryInfo[]型として取得します。

            string path = @"";
            DirectoryInfo diInfo = new DirectoryInfo(path);
            DirectoryInfo[] diInfomations = diInfo.GetDirectories();

そして、foreachで取得した複数のファイル名をreturnする際に、一時的にファイル名を保存するList型の変数を使用しています。
しかし、無駄なインスタンス変数を書くコーディングは行が多く見にくかったり、無駄にメモリを使ってしまうことから推奨はされません。

より見やすく効率が良いコードにするには、returnにListではなく、IEnumerableインスタンス変数の型として利用します。IEnumerableを利用すればLINQが利用できるのでよりスッキリとしたコードになります。

public IEnumerable<string> ReturnData1()
        {
            string path = @"";
            DirectoryInfo diInfo = new DirectoryInfo(path);
            IEnumerable<DirectoryInfo> diInfomations = diInfo.EnumerateDirectories();
            IEnumerable<string> names = diInfomations.Select(s => s.Name);
            return names;
        }

DirectoryInfoクラスを宣言するところまでは同じです。
違いはIEnumerable型のディレクション情報を得るためにEnumerateDirectories()メソッドを使用しています。 その後、ディレクション情報からLINQのSelectメソッドを用いファイル名を取得します。 LINQを使用したため中間変数のインスタンス変数を宣言しなくてすんでいます。

また、上記のコードは説明の都合上Selectメソッドの部分を複数行に分けましたが、普通は1行ですませます。

        public IEnumerable<string> ReturnData2()
        {
            string path = @"";
            DirectoryInfo diInfo = new DirectoryInfo(path);
            IEnumerable<string> names = diInfo.EnumerateDirectories().Select(s => s.Name);
            return names;
        }