プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 VC#、python3、ラズパイ始めました。

C#で複数のデータをreturnする

C#で関数を作っていると、複数のデータをreturnしたい場面があります。

複数のreturnというとコーディング上、大きく2つの意味合いがありますが、一つ目は簡単で文字通り条件によって複数のreturnのいづれかが実行されます。

private double function(double a, double b)
{
    if (a == b)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

このような場合は、コーディング規約等でretrunは1つにせよという風にされている場合もあるかもしれません。
その場合は、一度変数に入れてあげればよいです。

private double function(double a, double b)
{
    double ans;
    if (a==b)
    {
        ans = 1;
    }
    else
    {
        ans = 0;
    }
    return ans;
}

しかし、これらはいずれもreturnがいくつ書かれているかによらずfunctionの戻り値としては1つの変数です。

場合によっては↓のようなことをしたい時があると思いませんか?
ちなみに、pythonではこのような記法が可能でタプルとして戻ってきます。

private double function(double a, double b)
{
return a * 3,b * 4;
}
>> (6, 12) #pythonの例  a=2, b=3のとき

本篇

厳密にいうと関数の戻り値は0(つまり1つ)にしているが、結果的には複数の値を戻すことが出来る方法です。
戻したい値を格納する変数を配列で関数に渡してあげます。

private void Form1_Load(object sender, EventArgs e)
{
    double a = 2;
    double b = 3;
    double[] ans = new double[2];
    function(a, b, ans);
    MessageBox.Show(ans[0].ToString()+" , "+ans[1].ToString());
}
private double function(double a, double b, double[] ans)
{
    ans[0] = a * 3;
    ans[1] = b * 4;

    return 0;
}

入力のaとbと出力の配列(ans[])を関数の引数に入れて、関数の中で配列の中身を書き換えてあげます。