なんだかんだでプログラムが好き

私 すずきかつーき が主にプログラムに関する事を書いたり書かなかったりします

配列(IEnumerable)の中からランダムで一つ返却するLinq拡張

作っておくと、ちょっと便利

自分はテストなんかにすごく使ってます。無いと地味に困るレベル。

public static class LinqExtensions
{
    public static T RandomAt<T>(this IEnumerable<T> ie)
    {
        if (ie.Any() == false) return default(T);
        return ie.ElementAt(Random.Range(0, ie.Count()));
    }
}

使い方

   public void Start()
    {
        var data = new []{ 1, 2, 3, 4, 5, 10, 20, 31, 32, 33, 34, 35 };
        var r1 = data.RandomAt();
        Debug.Log("r1:" + r1); 
        var r2 = data.Where(num => num % 2 == 0).RandomAt();
        Debug.Log("r2:" + r2);
    }

IEnumerable<T>なので

var r1 = data.RandomAt(); のように、配列に直接使ってもよいですし、

var r2 = data.Where(num => num % 2 == 0).RandomAt(); のように、他のLinqと組み合わせてもよいです(この例では、int配列の偶数の値からランダムで一つ)