匿名型 (Anonymous types) の変数、オブジェクトを宣言する - C#

C#で匿名型を利用するコードを紹介します。

匿名型とは

明示的に型を定義せずに複数のメンバ変数を持つオブジェクトを作成できる機能です。

書式

匿名型が変数型の場合

var (変数名) = (初期値);

匿名型がオブジェクトの場合 (メンバ変数がある場合)

var (変数名) = new {
  (メンバ変数名1) = (初期値),
  (メンバ変数名2) = (初期値),
   ...
  (メンバ変数名n) = (初期値),
};
メンバ名には初期値を設定する必要があります。

また、下記の書式のようにオブジェクトを入れ子にする記述も可能です。
var (変数名) = new {
  (メンバ変数名1) = (初期値),
  (メンバ変数名2) = new{
    (サブメンバ変数名1)=(初期値),
    (サブメンバ変数名2)=(初期値),
    ...
    (サブメンバ変数名m)=(初期値)
  },
  (メンバ変数名3) = (初期値),
  ...
  (メンバ変数名n) = (初期値)
};

サンプルプログラム

UI

下図のUIを作成します。MultiLiesプロパティを"true"にしたテキストボックスとButtonを3つ配置します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AnonymousType
{
  public partial class FormMain : Form
  {
    struct MyStruct
    {
      public int id;
      public string name;

      public MyStruct(int s_id, string s_name)
      {
        id = s_id;
        name = s_name;
      }
    }

    class MyClass
    {
      public int id;
      public string name;

      public MyClass()
      {
        id = 0;
        name = "";
      }
    }

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      var mydata1 = new { id = 100, name = "Penguin" };
      var mydata2 = new { id = 101, name = "Bear" };

      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mydata1.id, mydata1.name);
      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mydata2.id, mydata2.name);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      MyStruct mystruct1 = new MyStruct();
      mystruct1.id = 200;
      mystruct1.name = "Penguin";

      MyStruct mystruct2 = new MyStruct();
      mystruct2.id = 201;
      mystruct2.name = "Bear";

      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mystruct1.id, mystruct1.name);
      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mystruct2.id, mystruct2.name);
    }

    private void button3_Click(object sender, EventArgs e)
    {
      MyClass myclass1 = new MyClass();
      myclass1.id = 300;
      myclass1.name = "Penguin";

      MyClass myclass2 = new MyClass();
      myclass2.id = 301;
      myclass2.name = "Bear";

      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", myclass1.id, myclass1.name);
      textBox1.Text += string.Format("{0:d} : {1:s}\r\n", myclass2.id, myclass2.name);
    }
  }
}

解説

button1のclickイベントは匿名型を利用した版のコードを、button2のclickイベントには構造体(struct)を利用した版のコード、button3はクラス(class)を利用した版のコードを記述しています。
button1
  var mydata1 = new { id = 100, name = "Penguin" };
  var mydata2 = new { id = 101, name = "Bear" };

  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mydata1.id, mydata1.name);
  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mydata2.id, mydata2.name);
1,2行目でvarキーワードを用いて匿名型の宣言と作成をしています。上記のコード例ではオブジェクト内にid, nameの2つのメンバを持ちます。
4,5行目で作成したオブジェクトの内容をテキストボックスに表示します。
button2
struct MyStruct
{
  public int id;
  public string name;

  public MyStruct(int s_id, string s_name)
  {
    id = s_id;
    name = s_name;
  }
}
上記コードは構造体の宣言です。
  MyStruct mystruct1 = new MyStruct();
  mystruct1.id = 200;
  mystruct1.name = "Penguin";

  MyStruct mystruct2 = new MyStruct();
  mystruct2.id = 201;
  mystruct2.name = "Bear";

  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mystruct1.id, mystruct1.name);
  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", mystruct2.id, mystruct2.name);
1~3,5~7行目で構造体の作成と、値の代入をしています。
9,10行目で構造体の内容をテキストボックスに表示します。
button3
class MyClass
{
  public int id;
  public string name;

  public MyClass()
  {
    id = 0;
    name = "";
  }
}
上記コードはクラスの宣言です。

  MyClass myclass1 = new MyClass();
  myclass1.id = 300;
  myclass1.name = "Penguin";

  MyClass myclass2 = new MyClass();
  myclass2.id = 301;
  myclass2.name = "Bear";

  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", myclass1.id, myclass1.name);
  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", myclass2.id, myclass2.name);
1~3,5~7行目でクラスの作成と、値の代入をしています。
9,10行目でクラスのメンバ変数の内容をテキストボックスに表示します。

= クラスを用いた場合でも構造体を用いた場合でもあらかじめ、オブジェクトが保有するメンバ変数やメソッドも含めてオブジェクトを宣言する必要があります。一方匿名型を用いた場合は、事前の宣言なくオブジェクトを作成できます。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。"100 : penguin", "101 : Bear"がテキストボックスに表示されます。


[button2]をクリックします。"200 : penguin", "201 : Bear"がテキストボックスに表示されます。


[button3]をクリックします。"300 : penguin", "301 : Bear"がテキストボックスに表示されます。

匿名型の配列

匿名型の配列を宣言することもできます。書式は以下になります。

匿名型の配列の書式

var (変数名) = new[] {
  new{
    (メンバ名1-1) = (初期値),
    (メンバ名1-2) = (初期値),
     ...
  },
  new{
    (メンバ名2-1) = (初期値),
    (メンバ名2-2) = (初期値),
     ...
  },
  ....
  new{
    (メンバ名n-1) = (初期値),
    (メンバ名n-2) = (初期値),
     ...
  }
};

サンプルプログラム

UI

下図のUIを作成します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AnonymousArrayType
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      var objarray = new[] {
        new{
          id=101,
          name="penguin"
        },
        new{
          id=102,
          name="bear"
        },
        new {
          id=103,
          name="hawk"
        },
        new{
          id=104,
          name="whale"
        },
        new{
          id=105,
          name="owl"
        }
      };

      foreach (var item in objarray) {
        textBox1.Text += string.Format("{0:d} : {1:s}\r\n", item.id, item.name);
      }
    }
  }
}

解説

var objarray = new[] {
  new{
    id=101,
    name="penguin"
  },
  new{
    id=102,
    name="bear"
  },
  new {
    id=103,
    name="hawk"
  },
  new{
    id=104,
    name="whale"
  },
  new{
    id=105,
    name="owl"
  }
};
上記コードで匿名型のオブジェクト配列を作成しています。

foreach (var item in objarray) {
  textBox1.Text += string.Format("{0:d} : {1:s}\r\n", item.id, item.name);
}
foreach文でループし、匿名型のオブジェクト配列の内容をテキストボックスに表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。オブジェクト配列の内容をテキストボックスに表示します。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2014-03-18
改訂日: 2021-05-09
iPentec all rights reserverd.