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