[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あとは、IsDefined のパフォーマンスが悪いという話をよく目にするが、実際はそれほど問題になるようなことはないと思う。それならソースの見通しを良くしておいた方がいいかな、というのが持論。().Contains((MyEnum)0); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); /* * 2544 * 126 * 4603 * 26415 */ } }