質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • C#

    7750questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

listの中にlistを作る

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 324

maam

score 8

先輩から「listの中にlistを作れば良い」と言われたのですが、
その表現の意味をイマイチ理解できません。
ネットで調べてもいろいろな表現をしていて、コードを見てもよくわかりません。
初心者でもわかるような説明をしていただけると嬉しいです。
また、わかりやすい例のコードがあれば教えていただきたいです。

private List<string> results = new List<string>();

この中にさらにlistを作る方法も教えていただきたいです。

private List<List<string>> results = new List<List<string>>();
for( int i = 0; i < 10; i++)
{
List<string> clist = new List<string>();
for(int j = 0; j < 5; j++)
{
clist.Add(i.ToString() + j.ToString());
}
list.Add(clist);
}
        

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/12/06 10:00

    追記したコードが意味不明です。コードを書くより言葉でそもそもどういうことがしたいのかという質問には答えられませんか?

    キャンセル

  • maam

    2018/12/06 10:09

    上記に書いたのは先輩の仰る「listの中にlistを作る」例です。行いたいことは、TextBoxに名前を入力し検索ボタンを押すと、SQLserverにある情報をDataGridViewに表示するということです。表示するためにListを作成し、Listに格納した後そのListから登録情報を引っ張ってくることを行いたいです。

    キャンセル

  • Zuishin

    2018/12/06 11:55 編集

    List<T> は通知機能を持たないのでリストのリストを DataGridView にバインドすることは至難の業です。なぜ先輩がそのように言ったのか真意を確かめる必要があります。本当にここに書かれていることが全てであるなら、SurferOnWww さんのおっしゃるような DataSet もしくは EntityFramework が最適解です。

    キャンセル

回答 5

+5

こんな感じになります

private List<List<string>> results = new List<List<string>>(); 

設定方法の例

            var test1 = new List<string>();
            test1.Add("a1");
            test1.Add("a2");
            results.Add(test1);

            var test2 = new List<string>();
            test2.Add("b1");
            test2.Add("b2");
            results.Add(test2);

質問に記載のコード(誤り)

            List<List<string>> results = new List<List<string>>();
            for( int i = 0; i < 10; i++)
            {
                List<string> clist = new List<string>();
                for(int j = 0; j < 5; j++)
                {
                    clist.Add(i.ToString() + j.ToString());
                }
                list.Add(clist);
            }

質問に記載のコード(修正)

            List<List<string>> results = new List<List<string>>();
            for( int i = 0; i < 10; i++)
            {
                List<string> clist = new List<string>();
                for(int j = 0; j < 5; j++)
                {
                    clist.Add(i.ToString() + j.ToString());
                }
                results.Add(clist);
            }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 17:00

    ご回答ありがとうございます。test1とtest2というのは、resultsの中に二つのlistを作っているという解釈でよろしいでしょうか??

    キャンセル

  • 2018/12/05 18:49

    この例ではそのようになります。

    キャンセル

  • 2018/12/06 10:54

    わかりました。ありがとうございます!!

    キャンセル

  • 2018/12/06 12:37

    list.Add(clist)でエラーになってると思い回答付けてみました

    キャンセル

checkベストアンサー

+2

行いたいことは、TextBoxに名前を入力し検索ボタンを押すと、SQLserverにある情報をDataGridViewに表示するということです。表示するためにListを作成し、Listに格納した後そのListから登録情報を引っ張ってくることを行いたいです。

であれば「listの中にlistを作る」というのは完全に見当違いです。

先輩の意図するところは何か別にあって、その意図を実現するためにそう言っているのかもしれませんが、単純にその言葉の表面だけを見ると「何言ってるのセンパイ?」って感じです。

List<T> 型を使いましょう。以下のような感じでList<T> 型のオブジェクトを作ってください。Order クラスが T に該当します。それを DataGridView にバインドすればいいです。

// SQL Server の Northwind サンプルデータベース Orders
// テーブルのレコードを格納するクラス定義
public class Order
{
    public int OrderID { get; set; }
    public string CustomerID { get; set; }
    public int? EmployeeID { get; set; }
    public DateTime? OrderDate { get; set; }
    public DateTime? RequiredDate { get; set; }
    public DateTime? ShippedDate { get; set; }
    public int? ShipVia { get; set; }
    public decimal? Freight { get; set; }
    public string ShipName { get; set; }
    public string ShipAddress { get; set; }
    public string ShipCity { get; set; }
    public string ShipRegion { get; set; }
    public string ShipPostalCode { get; set; }
    public string ShipCountry { get; set; }
}


  // SQL Server のサンプルデータベース Northwind の
  // Orders テーブルからデータを取得して List<Order>
  // オブジェクトを生成。Entity Framework を使う方が簡単
  // だが、ここではプリミティブに ADO.NET の SqlDataReader 
  // を使用した。
  protected List<Order> CreateOrderList()
  {
    List<Order> orders = new List<Order>();

    string connString = WebConfigurationManager.
            ConnectionStrings["NORTHWINDConnectionString"].
            ConnectionString;

    string query = "SELECT [OrderID], [CustomerID]," +
            "[EmployeeID], [OrderDate], [RequiredDate]," +
            "[ShippedDate], [ShipVia], [Freight]," +
            "[ShipName], [ShipAddress], [ShipCity]," +
            "[ShipRegion], [ShipPostalCode], [shipCountry]" +
            "FROM [Orders]";

    using (SqlConnection conn = new SqlConnection(connString))
    {
      conn.Open();
      using (SqlCommand cmd = new SqlCommand(query, conn))
      {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
          if (reader != null)
          {
            while (reader.Read())
            {
              Order record = new Order();

              record.OrderID = reader.GetInt32(0);
              record.CustomerID = reader.IsDBNull(1) ?
                      null : reader.GetString(1);
              record.EmployeeID = reader.IsDBNull(2) ?
                      null : (int?)reader.GetInt32(2);
              record.OrderDate = reader.IsDBNull(3) ?
                      null : (DateTime?)reader.GetDateTime(3);
              record.RequiredDate = reader.IsDBNull(4) ?
                      null : (DateTime?)reader.GetDateTime(4);
              record.ShippedDate = reader.IsDBNull(5) ?
                      null : (DateTime?)reader.GetDateTime(5);
              record.ShipVia = reader.IsDBNull(6) ?
                      null : (int?)reader.GetInt32(6);
              record.Freight = reader.IsDBNull(7) ?
                      null : (decimal?)reader.GetDecimal(7);
              record.ShipName = reader.IsDBNull(8) ?
                      null : reader.GetString(8);
              record.ShipAddress = reader.IsDBNull(9) ?
                      null : reader.GetString(9);
              record.ShipCity = reader.IsDBNull(10) ?
                      null : reader.GetString(10);
              record.ShipRegion = reader.IsDBNull(11) ?
                      null : reader.GetString(11);
              record.ShipPostalCode = reader.IsDBNull(12) ?
                      null : reader.GetString(12);
              record.ShipCountry = reader.IsDBNull(13) ?
                      null : reader.GetString(13);

              orders.Add(record);
            }
          }
        }
      }
    }
    return orders;
  }

それより、SQL Server の特定のテーブルのレコード一覧を DataGridView に表示するという目的には、Visual Studio のデータソース構成ウィザードを使って型付 DataSet / DataTable + TableAdapter を作り、それを BindingSource 経由で DataGridView にバインドするのが定番の方法です。

以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(v=vs.120).aspx

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(v=vs.120).aspx

操作に慣れると 10 分もかからず作れるはずです。

TextBoxに名前を入力し検索ボタンを押すと

というところは上記チュートリアルをベースに少し手を加えれば簡単にできます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

List<List<string>>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

private List<List<string>> results = new List<List<string>>();で良いかと思います。

と入力したらずらりと回答者が(笑
投稿前にリロードするべきでした。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 17:02

    ご回答ありがとうございます!たくさんの方が助けようとしてくださることに感動しています。ありがとうございます。

    キャンセル

+1

ここがわかりやすいです。
C#_二次元 List と List の配列

private List<List<string>> results = new List<List<string>>();


その例だとこんな感じで2重Listができますよ。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/05 16:59

    サイトまで教えていただいてありがとうございます!参考になりました。

    キャンセル

  • 2018/12/05 16:59

    C# では配列とリストは違うものなので修正お願いします。

    キャンセル

  • 2018/12/06 11:44

    修正しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7750questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。