[C#] Enum の存在チェックは奥が深い。

ある値が、Enum に含まれているかどうかのチェックには色々な方法があるのだが、回すやり方が速いようだ。少々意外な結果である。
class Program
    {
        enum MyEnum { a = 0, b, c }
        private const int loop = 10000000;

        static bool IsDefined(MyEnum myEnum)
        {
            var b = false;
            switch (myEnum)
            {
                case MyEnum.a:
                case MyEnum.b:
                case MyEnum.c:
                    b = true;
                    break;
            }
            return b;
        }

        static void Main(string[] args)
        {
            var sw = new Stopwatch();

            // Enum.IsDefined
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.IsDefined(typeof(MyEnum), 0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 泥臭い ? やり方
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                IsDefined((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // TryParse
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                var myEnum = new MyEnum();
                var b = Enum.TryParse("0", out myEnum);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 強引に LINQ を使う
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.GetValues(typeof(MyEnum)).Cast().Contains((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            /*
             * 2544
             * 126
             * 4603
             * 26415
             */

        }

    }
あとは、IsDefined のパフォーマンスが悪いという話をよく目にするが、実際はそれほど問題になるようなことはないと思う。それならソースの見通しを良くしておいた方がいいかな、というのが持論。

このブログの人気の投稿

Excel で入力した文字に勝手に取り消し線が入る

コピーした行の挿入が表示されない時はフィルタされていないかチェック