タプルとは?

タプル(Tuple)は、複数の型のデータを一つにまとめて扱える構造です。

C#では、タプルを簡単に作成でき、メソッドの戻り値として複数の値をまとめて返したい時や、

List等で扱うデータをグループ化したい場合に便利です。

タプルの作成

以下の例では、名前と年齢の組み合わせをイメージしたタプルを作成しました。

クラスや構造体を定義しなくてもこのように書くことが出来ます。

private void Awake()
{
    // 名前と年齢の組み合わせ
    (string, int) userData = ("Mike", 19);
    
    Debug.Log($"{userData.Item1} : {userData.Item2}");
}

以下の様に、メソッドの戻り値として使うことも出来ます。

private void Awake()
{
    // 名前と年齢の組み合わせ
    (string, int) userData = GetUserData();
    
    Debug.Log($"{userData.Item1} : {userData.Item2}");
}

private (string, int) GetUserData()
{
    return ("Mike", 19);
}

名前付きタプル

通常のタプルの場合、Item1,Item2で変数にアクセスします。

タプルを作成する際に名前も定義しておけば、名前でアクセスすることも出来ます。

private void Awake()
{
    // 名前と年齢の組み合わせ
    (string userName, int age) userData = GetUserData();
    
    Debug.Log($"{userData.userName} : {userData.age}");
}

(string, int)(string userName, int age) に変更しました。

userNameageでも変数を扱えるようになりました。

メソッドの戻り値に指定した名前と、受け取った側の名前が違う場合、

受け取った側の名前が使用されます。

private void Awake()
{
    // 名前と年齢の組み合わせ
    (string userName, int age) userData = GetUserData();
    
    Debug.Log($"{userData.userName} : {userData.age}");
}

private (string name, int level) GetUserData()
{
    return ("Mike", 19);
}

varで受け取った場合は戻り値の名前が使えます。

private void Awake()
{
    // 名前と年齢の組み合わせ
    var userData = GetUserData();
    
    Debug.Log($"{userData.name} : {userData.level}");
}

private (string name, int level) GetUserData()
{
    return ("Mike", 19);
}

値を入れ替える

二つの変数の値を入れ替えたい!という場合、

通常もう一つ変数を用意して以下の様に書くと思います。

int a = 10;
int b = 100;
int temp = a;
a = b;
b = temp;

余談ですがC/C++の頃はよく以下の様な書き方もしていました。

a^=b^=a^=b;

こういった場合もタプルを使うと簡単に書くことが出来ます。

int a = 10;
int b = 100;

(a, b) = (b, a);

// a = 100
// b = 10

まとめ

今回はタプルについて解説しました。

Unityでは、メソッドで複数の値を返したい場合がありますが、クラスや構造体を定義せずとも使えます。

便利な一方であまり多用するとコードが読みにくくなる可能性があります。

メソッド内まで、クラス内までといった制約を考えた方いいかもしれません。

機会があったら使ってみましょう。

🔗関連ページ