C#では特定の変数の値に対して、複数の物を保持して扱うことができます。これは「タプル(Tuple)」と呼ばれる技術で、同時に複数持つことのできるデータ型の一種です。メソッドの戻り値などで「複数を返したい」という場合に便利なので知っておくとよいでしょう。
タプル(Tuple)とは
C#でよく使用される「Tuple(タプル)」は、複数の異なる型の要素を一つのグループとして、まとめて保持できるデータ構造です。Tupleは.NET Framework 4.7以降で導入され、複数の値を一度に扱うために使用されるこおが多いです。Microsoftのドキュメントでは以下のように記述されています。
軽量データ構造に複数のデータ要素をグループ化するための簡潔な構文
タプル(Tuple)の特徴
タプルは以下の特徴を持っていることで知られています。
- 異なる型の値を持つことができる
- Tupleの要素に名前を付けることができる
- メソッドから複数の値を返す際に便利である
タプルは異なる型の値を持つことができます、たとえば整数、文字列、浮動小数点数といった値を一つのタプルで格納できる特徴があります。この特徴を利用してメソッドからの戻り値を複数返したい場合などで効果を発揮します。
var person = new Tuple<string, int>("Alice", 30);
var coordinates = Tuple.Create(42.123, -73.456);
// C# 7.0以降では名前付きの要素が利用可能
var point = (X: 10, Y: 20);
タプルの使い方については後で説明していきますが、上記のように複数の値を一つの変数として保持することが出来るのです。
タプル(Tuple)の使い方
タプルは複数の値を同時に持つことのできますが、値が1つの場合や値がない場合は使用することができませんので注意が必要です。かならず2つ以上の値をまとめる時に使用するようにしてください。
匿名型のタプル(Tuple)
値に変数名を付けずに匿名でタプルの値を作成する方法です。
//(型, 型)で定義
(int, int) first = (100, 10);
//要素の取り出し方
Console.WriteLine("Item1:" + first.Item1.ToString());
Console.WriteLine("Item2:" + first.Item2.ToString());
タプルの作成方法を「(型, 型)」と「変数名」で左辺を形成し、右辺を「(100, 10)」と型に対応する値をカンマ区切りで並べています。こういう場合に値を取り出すには「(変数名).Item1」と記述する必要があります。左からItem1、Itemo2、Item3・・・と続いていくことになります。
値に名称を付けるタプル(Tuple)
値に名称を付けてタプルを作成する方法です。こちらのほうが可読性は高いかなと思います。
//(型 引数名, 型 引数名)で定義
(int sum, int count) second = (100, 10);
//値を取り出す方法
Console.WriteLine("sum:" + second.sum.ToString());
Console.WriteLine("count:" + second.count.ToString());
今回はタプルを構成する値に対して名称を付与しました。一つ目にsum、二つ目にcountと名称を与えることで、値に対して意味を持たせるようにしています。こういう場合に値を取り出すには、「(変数名).(名称)」で取得できます。
また、タプルは値を作成して保持するだけでなく、値を書き換えることも可能です。
//(型 引数名, 型 引数名)のタプル
(string name, int number) tuple = ("First", 1);
//値を変更する
tuple.name = "changed";
tuple.number = 1000;
値を変更するにはタプルから変更したい値の要素名を左辺に指定し、右辺で設定したい値を記述するだけです。これで値が変更されています。今回はnameとnumberとしていますが、Item1やItem2の場合でも同様です。
メソッドの戻り値でタプル(Tuple)を使う方法
メソッドの戻り値として使用する方法です。
//タプルを作成する
(int sum, int count) val = GetTuple();
//タプルを戻り値とするメソッド
private static (int sum, int count) GetTuple()
{
return (100, 5);
}
メソッドの戻り値としてタプルを使用する場合は、戻り値の型としてタプルを記述するだけで使用可能です。あとはメソッド内部の戻り値でタプルを返却するだけでOKとなります。サンプルでは「GetTuple」メソッドでタプルを返すようにして、「(int sum, int count) val = GetTuple();」で受け取っています。
メソッドで複数の値を戻す必要のある場面では、タプルを使用して値をペアで戻すのも選択肢の一つとなります。
タプル(Tuple)のまとめ
タプルは簡単なデータ構造を作成するときや、メソッドから複数の値を返すときなどに便利な構文です。ただし、複雑なデータ構造を表現する場合には、クラスや構造体を使用するべきであるため、タプルは短い一時的なデータをグループ化したいときなどに限定して使うとよいと思います。
LINQなどでもタプルはよく使われています。「【C#】LINQを使用して要素のindexを取得する方法」ではタプルで値を保持しているサンプルコードもあるので、あわせてチェックしておいてもよいでしょう。是非とも日常の開発場面でもタプルを使ってみてください。