コガネブログ

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

【C#】パフォーマンスに優れた列挙型を使用できる「Enums.NET」紹介

はじめに

「Enums.NET」をプロジェクトに追加することで
パフォーマンスに優れた列挙型を使用できるようになります

インストール

f:id:baba_s:20180129175245p:plain

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

f:id:baba_s:20180326100106p:plain

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

f:id:baba_s:20180326100122p:plain

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

パフォーマンス検証

using EnumsNET;
using System;
using System.Diagnostics;
using System.Text;

public static class Program
{
    private enum TYPE
    {
        GRASS,
        FIRE,
        WATER,
    }

    private static void Main()
    {
        int count = 10000000;

        var sb = new StringBuilder();
        var sw = new Stopwatch();

        // 通常の列挙型
        sw.Start();
        for ( int i = 0; i < count; i++ )
        {
            var result = Enum.GetValues( typeof( TYPE ) ) as TYPE[];
        }
        sw.Stop();

        sb.AppendFormat( "Enum: {0}", sw.Elapsed ).AppendLine();

        // Enums.NET
        sw.Restart();
        for ( int i = 0; i < count; i++ )
        {
            var result = Enums.GetMembers<TYPE>();
        }
        sw.Stop();

        sb.AppendFormat( "Enums: {0}", sw.Elapsed ).AppendLine();

        Console.WriteLine( sb );
    }
}
種類 時間
通常の列挙型 9.61 秒
Enums.NET 0.42 秒

機能

using EnumsNET;
using System;

public static class Program
{
    [Flags]
    private enum TYPE
    {
        NONE = 0,
        GRASS = 1,
        FIRE = 2,
        WATER = 4,
    }

    private static void Main()
    {
        // 列挙型のすべての要素を取得
        var members = Enums.GetMembers<TYPE>();
        var values = Enums.GetValues<TYPE>( EnumMemberSelection.Distinct );

        // 列挙型の要素数を取得
        Console.WriteLine( Enums.GetMemberCount<TYPE>() ); // 4

        // 指定されたすべてのフラグを含む場合 true
        Console.WriteLine( TYPE.GRASS.HasAllFlags( TYPE.GRASS ) ); // True

        // 指定されたいずれかのフラグを含む場合 true
        Console.WriteLine( TYPE.GRASS.HasAnyFlags( TYPE.GRASS ) ); // True

        // 指定されたフラグを削除して返します
        Console.WriteLine( TYPE.GRASS.RemoveFlags( TYPE.GRASS ) ); // NONE

        // ToString と同等
        Console.WriteLine( TYPE.GRASS.AsString() ); // GRASS

        // 要素名を取得
        Console.WriteLine( TYPE.GRASS.GetName() ); // GRASS

        // 指定された要素を列挙型に含む場合 true
        Console.WriteLine( ( ( TYPE )4 ).IsValid() ); // True

        // 指定された文字列を列挙型に変換
        Console.WriteLine( Enums.Parse<TYPE>( "GRASS" ) ); // GRASS
    }
}