Home > C# > C# 学び直し > List<T>クラス

C# List<T>の2次元配列List<List<T>>

新規作成日 2017-10-22
最終更新日

C#のオブジェクトは、オブジェクトを格納できます。そのため、List<T>のTの部分に新たにList<T>を入れることも実現可能です。うまく利用すれば、かなり複雑なデータコンテナとしても利用可能です。

ただ、有効に活用しようとする、Tの部分に使用するクラスに、ICollection<T>とIEnumerable<T>インターフェイスを実装し、必要なメソッドを上書きしたクラスを使う必要があります。慣れれば気にならないかもしれませんが、結構面倒です。その際、一時的な先延ばし策として、List<T>クラスを代用として使用しList<T>の2次元配列List<List<T>>を使用する方法があります。また、純粋に、List<T>の2次元配列を使用することがあるかもしれません。

具体的な例として、csvファイルをList<List<T>>に格納するプログラムを紹介します。

読み込むファイル

読み込むファイルは、以下の内容で、ファイル名「TextFile.txt」で、文字エンコードUTF-8で保存します。

// 英語,複数形,性別,日本語,数詞
dog,dogs,male,犬,匹
bitch,bitchs,female,犬,匹
cat,cats,non,猫,匹
rabbit,rabbits,non,兎,羽

一度、実行ボタンを押してビルドすることで現れるプロジェクトフォルダー内のbin→Dibugフォルダにコピーします。

プログラム

プログラムを以下に示します。完成したプログラムは簡単に見えますが、オブジェクトをやり取りする際、オブジェクトがどのような状態か意識して、適切に扱う必要があるので、慣れないうちは試行錯誤を伴います。 自分が参考にできるサンプルプログラムとして、さまざまなものをすぐに利用できる状態にしておくと便利です。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;


namespace StreamReaderToList
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 読み込むファイルのファイル名
                var filePath = @"TextFile.txt";
                // 読み込んだデータを格納するList<List<string>>
                List<List<string>> LoadFileData = new List<List<string>>();


                string line;
                String[] readLine;

                // 読み込むファイルが存在するか確認する
                if (File.Exists(filePath))
                // ファイルが存在するときだけ処理する
                {   /* StreamReaderを使った読み込み処理 */
                    using (StreamReader sr = new StreamReader(filePath, Encoding.UTF8))
                    {

                        // ファイルの末端に達するまで、ファイルから行を読み込んで、表示します。
                        while (!sr.EndOfStream)
                        {
                            // 内側のList<string> ループの内側でList<string>を作成するのがポイント
                            List<string> stringList = new List<string>();

                            line = sr.ReadLine();
                            // 読み込んだ1行をString[]に格納
                            readLine = line.Split(',');
                            // 内側のList<string>にString[]の内容を格納
                            stringList.AddRange(readLine);
                            // List<List<string>>に代入さうるために使用するList<List<string>>に内側のList<string>の内容を追加
                            LoadFileData.Add(stringList);

                            // 配列上書きの挙動が理解できていないので、readLineをクリア
                            readLine = null;
                        }
                    }
                    // List<List<string>>の内容をコンソールに出力
                    foreach (List<string> insideList in LoadFileData)
                    {
                        foreach (string str in insideList)
                        {
                            Console.Write(str);
                            Console.Write('\t');
                        }
                        Console.Write('\n');
                    }
                }
                else
                {
                    Console.WriteLine("ファイル「{0}」が存在しません。", filePath);
                }
                // Keep the console window open in debug mode.
                // デバッグモードで、コンソール・ウインドウを開いたままにします。
                System.Console.WriteLine("何かキーを押すと終了");
                System.Console.ReadKey();
            }
            catch (Exception e)
            {
                // Let the user know what went wrong.
                // ユーザーに、何が問題になったのかを知らせます。
                // The file could not be read:
                Console.WriteLine("ファイルを読み取れませんでした:");
                Console.WriteLine(e.Message);
            }
        }
    }
}

実行結果

実行結果
このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」