動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
技術記事

C#で変数の入れ替えをタプルでやってみた

バイブス父さん
現役の業務SE
2020年4月6日5 min read
C#で変数の入れ替えをタプルでやってみた

C#で変数の入れ替えをする場合にタプルを使えば、一時変数無しに書く事ができます。

一時変数ありの場合

一時変数ありの場合 (csharp)#b72acd62a946
    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を入れる

これの結果が下記のような感じ。

一時変数無しで書くとうまく動かない。

一時変数ありの場合 (csharp)#6f6208fdaa83
   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();
        }
    }
▸ 実行ボタンで結果を表示

タプルでやってみた場合

一時変数を使いたくないので、タプルで処理をしてみると下記のようにシンプルに書ける。

タプルでやってみた場合 (csharp)#20be75b170a6
    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();
        }
    }
▸ 実行ボタンで結果を表示

タプルが便利な予感

ではここでいうタプルって何なのか?

気になったので調べてみた。

結果下記のような感じらしい。

(int x, int y)というような、引数みたいな書き方で「名前のない型」を作れます
この書き方をタプルと呼びます

https://ufcpp.net/study/csharp/datatype/tuples/

タプルは名のない型らしい。

KeyValuePairみたいなもの?

タプルを使ってみた。

タプルを使ってみた。 (csharp)#5f5e9fa3ebab
    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();
 
        }
    }
▸ 実行ボタンで結果を表示

こんな感じで書いてみて実行すると下記のようになる。

配列やリストを作ることもできる。

配列やリストを作ることもできる。 (csharp)#eed089d96c0b
    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();
 
        }
    }
▸ 実行ボタンで結果を表示

結果はこうなる。

引数にもできる。

引数にもできる。 (csharp)#eb66ff26b2d7
    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;
        }
    }
▸ 実行ボタンで結果を表示

結果はこうなる。

戻り値にも使える。

戻り値にも使える。 (csharp)#c39cb6e992d5
    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);
        }
    }
▸ 実行ボタンで結果を表示

タプルのネストも可能

タプルのネストも可能 (csharp)#7c35180b3626
   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#は奥が深いなーーっと。そう思いました。

この記事のコードと手順は ぜんぶ動作検証済み。 安心して現場で試してくれ。
バイブス父さん

現役の業務SE。C# / SQL Server 保守の現場から、コードも人もキャリアも全部書く。 実体験ベース。

運営者について