我正在制作一个XNA游戏,我每次更新都会调用下面的代码2到20次。我试着用谷歌搜索,似乎有点慢,所以我想问一下有没有更快的方法来比较类型?
代码:
public Modifier this[Type type]
{
get
{
for (int i = 0; i < this.Count; i++)
{
if (this[i].GetType() == type)
{
return this[i];
}
}
throw new NotImplementedException("Fix this");
}
set
{
for (int i = 0; i < this.Count; i++)
{
if (this[i].GetType() == type)
{
this[i] = value;
}
}
if(System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
}
}这段代码是在继承自列表的ModifierCollection类中编写的。修改器是粒子引擎的一部分。另外,我的游戏还不能真正测试它,所以我不能测试它,但是它应该可以工作吧?
我读到一些关于RunTimeTypeHandles的东西,它应该更快,我应该使用它吗?
编辑:我的目标是可以做到以下几点:
(particleEffect["NameOfEmitter"].Modifiers[typeof(SomeCoolModifier)] as SomeCoolModifier).Variable = Value;基本上,我只想在运行时更改一些修饰符的值。
编辑2:我刚刚意识到我可以将修饰符的引用保存到我现在所在的类,调用这个:P如果我有5-10个修饰符,可能不是干净的代码,但应该删除这个问题。
发布于 2011-09-03 01:56:53
如果不需要Type公开的任何额外功能,并且只关心类型之间的绝对相等--即不需要支持继承--RuntimeTypeHandle是进行这种比较的最快方法。
不过,我真的会质疑这是否是您的类设计的一个弱点。除非有令人信服的理由直接检查类型,否则在对象上公开表示它们是什么的某种值(可能是枚举)并与之进行比较可能更好。
发布于 2011-09-03 01:53:48
您可以将这些值存储在按类型索引的字典中,而不是列表中,这样就不必每次都对列表执行O(n)迭代。
正如评论中所指出的,这确实取决于n的大小,并且可能是一个微优化。我建议分析你的应用程序。
发布于 2011-09-03 02:01:50
如果你想变得更快,并且可以信任调用你的代码,那么把索引器改成只接受int类型。然后,在调用者用来向列表中添加类型的任何方法(您没有显示)中,将相应的int返回给它们。这是一个更糟糕的API,但它意味着你不需要做任何循环或查找。
https://stackoverflow.com/questions/7287354
复制相似问题