1225

Twitter:@dn0t_ GitHub:@ogrew

【Unity】そろそろラムダ式の便利さを。

ラムダ式を使えるようになりたいと思って、人様の書いたコードを見様見真似で書いているうちに雰囲気を掴めたので簡単な例を出してまとめておく。

やることは与えられた数値の配列から正の数値だけに絞るという超簡単なもの。

まずは素直に...

using System.Collections.Generic;
using UnityEngine;


public class TestLambda : MonoBehaviour
{
    public void Start()
    {
        int[] nums = new int[] { -5, -3, 5, 6, -2, 4, -9 };

        var result = new List<int>();
        foreach (int num in nums)
        {
            if (Positive(num))
            {
                result.Add(num*num);
            }
        }
        Debug.Log(string.Join(",", result));
    }

    bool Positive(int num)
    {
        if (num > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

わざと助長に書いていますが、まあそのまま、素直にです。だるい。

んで、それをLINQを使って書くとこう。

        var result = nums
            .Where(x => x > 0)
            .Select(x => Mathf.Pow(x, 2));

最初の例と同じ部分は省略して。Where句で条件を、Select句で処理を書く感じです。 というか、これまさにPerlで言う所のmap,grepですね。

grep <-> Where
map <-> Select

の関係。 他にもSortとかもあるから余計。

複数条件も簡単!

        var result = nums
            .Where(x => x > 0 && x % 2 == 0)
            .Select(x => Mathf.Pow(x, 2));

絞る条件を複数にしてみます。ここでは偶数に絞ります。

このケースはシンプルだからいいけど...

        var result = nums
            .Where(x => Positive(x) && Odds(x))
            .Select(x => Mathf.Pow(x,2));

......


bool Positive(int num)
    {
        if (num > 0) {
            return true;
        } else
        {
            return false;
        }
    }

    bool Odds(int num)
    {
        if (num % 2 == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

複雑になった場合は関数で切り分けてしまうのもありだと思います。 こう書いたとしても読みやすさは変わらないのでLINQいいですね。

さいごに

ラムダ式ってかLINQの話でしたね。まあ切っても切り離せないものだと思います。

これって関数名を考えるのにいちいち悩まなくていいってのがありがたいですね。 特に、1度しか使わない関数とか。

おわり。

f:id:taiga006:20200313201755p:plain