【C#】Tuple(タプル)型の使い方

C#でのTuple(タプル)型の使い方をまとめます。
メソッドの戻り値は本来一つですが、Tuple型を使うことで、複数の戻り値を設定することができます。また、複数のオブジェクトをひとまとめにして扱うこともできます。
※C#7.0以上から使用可

【検証環境】.NET Framework 4.7.2

Tupleの使い方

C#のTupleはメソッドの戻り値を複数設定することができます。
つまり、複数の戻り値のためだけにわざわざクラスを定義する必要が無くなります。

// 名前のないタプルの宣言
var unnamed = ("one", "two");
var tuple1 = unnamed.Item1;
var tuple2 = unnamed.Item2;

// 名前付きのタプルの宣言
var named = (first: "one", second: "two");
tuple1 = named.first;
tuple2 = named.second;

// 複数のオブジェクトを返すメソッド
(string, int) GetTuple()
{
    return ("tuple1", 111);
}

サンプルコード

BMI値を計算して、BMI値(double型)と肥満かどうか(bool型)を返すメソッドを作成してみます。

class Person
{
    public string Name { get; set; }
    public int Height { get; set; }
    public int Weight { get; set; }

    public static List<Person> GetPepople()
    {
        return new List<Person>()
        {
            new Person()
            {
                Name = "A",
                Height = 175,
                Weight = 70,
            },
            new Person()
            {
                Name = "B",
                Height = 150,
                Weight = 50,
            },
            new Person()
            {
                Name = "C",
                Height = 190,
                Weight = 60,
            },
            new Person()
            {
                Name = "D",
                Height = 160,
                Weight = 90,
            },
        };
    }
}

static void Main(string[] args)
{
    //BMI値と肥満判定をタプルでまとめて返す
    var people = Person.GetPepople();
    foreach (var person in people)
    {
        var tuple = GetBMI(person);
        Console.WriteLine($"{person.Name}さんはBMIが{tuple.BMI}で、{(tuple.judge ? "肥満です" : "肥満ではありません")}");
    }
    Console.ReadLine();
    //AさんはBMIが22.9で、肥満ではありません
    //BさんはBMIが22.2で、肥満ではありません
    //CさんはBMIが16.6で、肥満ではありません
    //DさんはBMIが35.2で、肥満です

    (double BMI, bool judge) GetBMI(Person person)
    {
        //BMI=体重kg/(身長m)2
        var BMI = Math.Round(person.Weight / Math.Pow((double)person.Height / 100, 2), 1);

        if (BMI < 25)
        {
            //肥満でない
            return (BMI, false);
        }
        else
        {
            //肥満である
            return (BMI, true);
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *