Tuple クラスを利用して複数の値を保持するオブジェクトを作成する - C#

Tuple クラスを利用して複数の値を保持するオブジェクトを作成するコードを紹介します。

概要

Tuple クラスを利用すると複数の値を保持するオブジェクトを作成できます。
補足
C#7以降で利用できるタプル型とは異なります。タプル型についてはこちらの記事を参照してください。

書式

宣言は次の書式を利用します。
Tuple<(型名1), (型名2), .... (型名n)> (オブジェクト名);

Tupleクラスに保持できる値の数は7つまでです。7つ以上の値を格納する場合は、8個目のパラメーターに Tuple クラスを入れ子にします。
Tuple<(型名1), (型名2), (型名3), (型名4), (型名5), (型名6), (型名7), Tuple<(型名8), (型名9), ... (型名n)>> (オブジェクト名);

値の代入はコンストラクタで実行します。
(Tuple型のオブジェクト) = new Tuple<(型名1), (型名2), .... (型名n)>( (値1), (値2), ... (値n) );

要素にアクセスする場合は、メンバ名に Item(n) を指定すると値を参照できます。3つ目の値にアクセスする場合は (オブジェクト名).Item3 となります。

プログラム例

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 TupleClass
{
  public partial class FormTupleClass : Form
  {
    public FormTupleClass()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Tuple<int, string, string> data = new Tuple<int, string, string>(1,"penguin cookie", "ぺんぎんクッキー");
      textBox1.Text += string.Format("(id, Name(ja))=({0:d},{1})\r\n", data.Item1, data.Item3);
    }
  }
}

解説

int, string, string 型の3つの値を持つ Taple クラスを作成します。コンストラクタで値を代入します。
  Tuple<int, string, string> data = new Tuple<int, string, string>(1,"penguin cookie", "ぺんぎんクッキー");

Tupleオブジェクトから値を参照してテキストボックスに表示します。Item1 で1つ目の値、Item3 で3つ目の値をテキストボックスに表示します。
  textBox1.Text += string.Format("(id, Name(ja))=({0:d},{1})\r\n", data.Item1, data.Item3);

実行結果

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


[button1]をクリックします。Tupleクラスのオブジェクトに値を代入し、代入した値を参照してテキストボックスに値を表示できました。


補足:書き換えの不可

Tupleクラスで作成したオブジェクトはコンストラクタでのみ値を設定可能です。Item(n) に対して値の代入はできません。
  private void button1_Click(object sender, EventArgs e)
  {
    Tuple<int, string, string> data = new Tuple<int, string, string>(1,"penguin cookie", "ぺんぎんクッキー");

    data.Item2 = "Penguin Cookie"; //この行でコンパイルエラー

    textBox1.Text += string.Format("(id, Name(ja))=({0:d},{1})\r\n", data.Item1, data.Item3);
  }

コンパイルすると次のエラーが発生します。
メッセージ
CS0200: プロパティまたはインデクサー 'Tuple<int, string, string>.Item2' は読み取り専用であるため、割り当てることはできません

補足
値を編集できるようにしたい場合は、ValueTupleオブジェクトを利用するか、Tuple型を利用します。
ValueTupleについてはこちらの記事を参照してください。
Tuple型についてはこちらの記事を参照してください。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-11-05
作成日: 2022-11-04
iPentec all rights reserverd.