コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】高速な LINQ を使用できる「LinqFaster」紹介

はじめに

「LinqFaster」をプロジェクトに追加することで
高速な LINQ を使用できるようになります

インストール

f:id:baba_s:20190826132012p:plain

Visual Studio メニューの「ツール>NuGet パッケージ マネージャー>
ソリューションの NuGet パッケージの管理」を選択します

f:id:baba_s:20190826132024p:plain

「参照」タブを選択して、検索欄に「LinqFaster」と入力して
表示された「LinqFaster」を選択します

f:id:baba_s:20190826132030p:plain

インストールしたいプロジェクトをチェックして「インストール」ボタンを押します

速度検証

using JM.LinqFaster;
using System;
using System.Diagnostics;
using System.Linq;

class Program
{
    static void Main()
    {
        var list = Enumerable.Range( 0, 10000 ).ToArray();

        var sw1 = new Stopwatch();
        sw1.Start();

        for ( int i = 0; i < 10000; i++ )
        {
            list.Max();
            list.Min();
            list.Sum();
            list.Average();
        }

        sw1.Stop();

        var sw2 = new Stopwatch();
        sw2.Start();

        for ( int i = 0; i < 10000; i++ )
        {
            list.MaxF();
            list.MinF();
            list.SumF();
            list.AverageF();
        }

        sw2.Stop();

        Console.WriteLine( sw1.Elapsed.TotalSeconds );
        Console.WriteLine( sw2.Elapsed.TotalSeconds );
    }
}
種類 処理時間
LINQ 2.9 秒
LinqFaster 0.4 秒

使用例

using JM.LinqFaster;

class Program
{
    static void Main()
    {
        // 配列を作成
        var myArray = LinqFaster.RangeArrayF( -500, 1000 );

        // リストを作成
        var myList = LinqFaster.RepeatListF( 5.0f, 1000 );

        // 合計値を計算
        var sum  = myArray.SumF();
        var sum2 = myArray.SumF( x => x * x );

        // 平均値を計算
        var average  = myArray.AverageF();
        var average2 = myArray.AverageF( x => x * x );

        // 最小値を取得
        var min  = myArray.MinF();
        var min2 = myArray.MinF( x => x * x );

        // 最大値を取得
        var max  = myArray.MaxF();
        var max2 = myArray.MaxF( x => x * x );

        // Where と Select の統合
        var newArray  = myArray.WhereSelectF( x => x % 2 == 0, x => x * x );
        var newArray2 = myArray.SelectWhereF( x => x * x, x => x % 2 == 0 );

        // Where と Aggregate の統合
        var filteredSum = myArray.WhereAggregateF( x => x % 2 == 0, ( acc, x ) => acc + x );
    }
}

関連記事