C#で変数の入れ替えをする場合にタプルを使えば、一時変数無しに書く事ができます。
目次
一時変数ありの場合
class Program
{
static void Main(string[] args)
{
var num1 = 1;
var num2 = 3;
var temp = num1;
num1 = num2;
num2 = temp;
Console.WriteLine("num1:" + num1);
Console.WriteLine("num2:" + num2);
Console.ReadLine();
}
}
めちゃくちゃシンプルに書くと上のような感じ。
- 一時変数tempにnum1を入れる
- num1にnum2を入れる
- num2にtempを入れる
これの結果が下記のような感じ。
一時変数無しで書くとうまく動かない。
class Program
{
static void Main(string[] args)
{
var num1 = 1;
var num2 = 3;
num1 = num2;
num2 = num1;
Console.WriteLine("num1:" + num1);
Console.WriteLine("num2:" + num2);
Console.ReadLine();
}
}
タプルでやってみた場合
一時変数を使いたくないので、タプルで処理をしてみると下記のようにシンプルに書ける。
class Program
{
static void Main(string[] args)
{
var num1 = 1;
var num2 = 3;
(num1, num2) = (num2, num1);
Console.WriteLine("num1:" + num1);
Console.WriteLine("num2:" + num2);
Console.ReadLine();
}
}
タプルが便利な予感
ではここでいうタプルって何なのか?
気になったので調べてみた。
結果下記のような感じらしい。
https://ufcpp.net/study/csharp/datatype/tuples/
(int x, int y)
というような、引数みたいな書き方で「名前のない型」を作れます
この書き方をタプルと呼びます
タプルは名のない型らしい。
KeyValuePairみたいなもの?
タプルを使ってみた。
class Program
{
static void Main(string[] args)
{
var user = (1, "Taro", "Japan");
var user2 = (2, "Hisashi", "Japan");
Console.WriteLine("Id" + user.Item1 + "名前:" + user.Item2 + "住所:" + user.Item3);
Console.WriteLine("Id" + user2.Item1 + "名前:" + user2.Item2 + "住所:" + user2.Item3);
Console.ReadLine();
}
}
こんな感じで書いてみて実行すると下記のようになる。
配列やリストを作ることもできる。
class Program
{
static void Main(string[] args)
{
var userList = new List<(int No,string Name,string address)>();
userList.Add((1, "Taro", "Japan"));
userList.Add((2, "Hisashi", "Japan"));
foreach (var user in userList)
{
Console.WriteLine("Id:" + user.No + "名前:" + user.Name + "住所:" + user.address);
}
Console.ReadLine();
}
}
結果はこうなる。
引数にもできる。
class Program
{
static void Main(string[] args)
{
var nums = (1,2);
var result = Add(nums);
Console.WriteLine("結果は:" + result);
Console.ReadLine();
}
public static int Add((int num1, int num2) nums)
{
return nums.num1 + nums.num2;
}
}
結果はこうなる。
戻り値にも使える。
class Program
{
static void Main(string[] args)
{
var nums = (10,3);
var result = Division(nums);
Console.WriteLine("10を3割ると結果は" + result.result + "余りは" + result.Amari);
Console.ReadLine();
}
public static (int result, int Amari) Division((int num1, int num2) nums)
{
var result = nums.num1 / nums.num2;
var amari = nums.num1 % nums.num2;
return (result, amari);
}
}
タプルのネストも可能
class Program
{
static void Main(string[] args)
{
var users = new List<
(int No,
(string firstName,string secondName) Name
,int age
,string gender)>();
users.Add((1,
("Tanaka", "Hisashi"),
19,
"Male"));
foreach (var user in users)
{
Console.WriteLine(user.Name.firstName + user.Name.secondName);
}
Console.ReadLine();
}
}
タプルは名前のない型なので、上記のようにネストにすることもできる。
結果はこう。
結論タプルの正体はなに?
ここまで来てタプルの正体ってなんとなくだけど、JavaScriptでいうところの、オブジェクトっぽい気がしてきた。
一時的な変数の塊を作る場合等に効果を発揮する。
一方で一時的でない場合は、クラスを作ってしまった方が良いのかもしれない。
c#は奥が深いなーーっと。そう思いました。
コメント