Tuple(タプル) を利用して変数の値をスワップするコードを紹介します。
概要
C#で新たに導入されたタプル(Tuple)を利用すると、スワップ変数を利用せずに変数の値の交換ができます。
書式
変数1と変数2の値を交換する場合以下の書式となります。
プログラム
変数の値をスワップするプログラムを実装します。
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