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

この記事は約 4 分で読めます。

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();
        }
    }

タプルが便利な予感

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

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

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

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

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

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

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#は奥が深いなーーっと。そう思いました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA