Tuple(タプル) を利用した変数の値のスワップ - 変数の値の交換 - C#

Tuple(タプル) を利用して変数の値をスワップするコードを紹介します。

概要

C#で新たに導入されたタプル(Tuple)を利用すると、スワップ変数を利用せずに変数の値の交換ができます。

書式

変数1と変数2の値を交換する場合以下の書式となります。
(変数1, 変数2) = (変数2, 変数1)

プログラム

変数の値をスワップするプログラムを実装します。

UI

下図のUIを作成します。ボタンを2つ複数行のテキストボックスを1つ配置します。

コード:オーソドックスな実装

タプルを利用しない、オーソドックスなスワップのコードを記述します。下記のコードを記述します。
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 SimpleTuple
{
  public partial class FormSwap : Form
  {
    public FormSwap()
    {
      InitializeComponent();
    }

    private void Button1_Click(object sender, EventArgs e)
    {
      int x = 10;
      int y = 4;

      int tmp;
      tmp = x;
      x=y;
      y = tmp;

      textBox1.Text = string.Format("(x,y)=({0:d},{1:d})", x, y);
    }
  }
}

解説

変数 x に10、yに4を代入します。
  int x = 10;
  int y = 4;

tmp変数を用意し、xの値をtmp変数に代入し、yの値をxに代入し、tmpの値をyに代入することで、xとyの値を入れ替えます。
  int tmp;
  tmp = x;
  x=y;
  y = tmp;

xとyの値を適すボックスに表示します。値が入れ替わった結果が表示できます。
  textBox1.Text = string.Format("(x,y)=({0:d},{1:d})", x, y);

コード:タプルを利用したスワップ

タプルを利用して変数のスワップをするコードを記述します。下記のコードを記述します。
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 SimpleTuple
{
  public partial class FormSwap : Form
  {
    public FormSwap()
    {
      InitializeComponent();
    }

    private void Button2_Click(object sender, EventArgs e)
    {
      int x = 10;
      int y = 4;

      (x, y) = (y, x);
      textBox1.Text = string.Format("(x,y)=({0:d},{1:d})", x, y);

    }
  }
}

解説

変数 x に10、yに4を代入します。
  int x = 10;
  int y = 4;

タプルを利用してxとyの値を入れ替えます。
  (x, y) = (y, x);

xとyの値を適すボックスに表示します。値が入れ替わった結果が表示できます。
  textBox1.Text = string.Format("(x,y)=({0:d},{1:d})", x, y);

実行結果

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


[Legacy]のボタンをクリックします。下図の結果がテキストボックスに表示されます。xとyの値が入れ替わっていることが確認できます。


[Tuple]のボタンをクリックします。[Legacy]のボタンと同じ結果がテキストボックスに表示されます。xとyの値が入れ替わっていることが確認できます。

プログラム2 : 配列の場合

先のプログラムにボタンを追加して、下記のコードを記述します
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 SimpleTuple
{
  public partial class FormSwap : Form
  {
    public FormSwap()
    {
      InitializeComponent();
    }

    private void Button3_Click(object sender, EventArgs e)
    {
      int[] array1 = { 3, 2, 8, 5, 3, 1 };
      int[] array2 = { 8, 3 };

      (array1, array2) = (array2, array1);

      textBox1.Text += "array1: ";
      foreach (int value in array1) {
        textBox1.Text += value.ToString() +", ";
      }
      textBox1.Text += "\r\n";

      textBox1.Text += "array2: ";
      foreach (int value in array2) {
        textBox1.Text += value.ToString() + ", ";
      }
    }
  }
}

解説

下記のコードで、変数の場合と同様の記述で配列の値のスワップもできます。
  (array1, array2) = (array2, array1);

実行結果

プロジェクトを実行します。ボタンをクリックすると、配列の値が表示されます。array1 と array2 の値が入れ替わっていることが確認できます。

プログラム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 SimpleTuple
{
  public partial class FormSwap : Form
  {
    public FormSwap()
    {
      InitializeComponent();
    }

    private void Button4_Click(object sender, EventArgs e)
    {
      List<string> list1 = new List<string>{ "ペンギン","アヒル","ニワトリ", "カルガモ"};
      List<string> list2 = new List<string> { "ラクダ", "クジラ", "イルカ" };

      (list1, list2) = (list2, list1);

      textBox1.Text += "list1: ";
      foreach (string str in list1) {
        textBox1.Text += str + ", ";
      }

      textBox1.Text += "\r\n";
      textBox1.Text += "list2: ";
      foreach (string str in list2) {
        textBox1.Text += str + ", ";
      }
    }
  }
}

解説

下記のコードで、変数の場合と同様の記述で配列の値のスワップもできます。
  (list1, list2) = (list2, list1);

実行結果

プロジェクトを実行します。ボタンをクリックすると、リストの値が表示されます。list1 と list2 の値が入れ替わっていることが確認できます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-07
作成日: 2019-08-22
iPentec all rights reserverd.