我正在试图找到禁食的方式来设置通用列表中每个项目的特定属性。C#每个列表项目的性能设置值
基本上,需求是迭代项目列表并将IsHit属性重置为FALSE。之后只有第二个“hit”列表中的项目应设置为TRUE。
我第一次尝试是这样的:
listItems.ForEach(delegate(Item i) { i.IsHit = false; });
foreach (int hitIndex in hits)
{
listItems[hitIndex - 1].IsHit = true;
}
注:点击率是1为主,项目列表是基于0。
然后我试图提高速度以及与此想出了:
for (int i = 0; i < listItems.Count; i++)
{
bool hit = false;
for (int j = 0; j < hits.Count; j++)
{
if (i == hits[j] - 1)
{
hit = true;
hits.RemoveAt(j);
break;
}
}
if (hit)
{
this.listItems[i].IsHit = true;
}
else
{
this.listItems[i].IsHit = false;
}
}
我知道这是一个微型的优化,但它确实是时间敏感的代码,所以它才有意义,以提高这些代码超出了可读性...当然只是为了好玩;-)
不幸的是,我真的没有看到任何改进代码的方法。但我可能错过了一些东西。
由于
PS:代码在C#/ .NET 2.0是优选的。
我结束了切换到Eamon Nerbonne解决方案。但后来我发现我的基准测试中有些奇怪。
委托:
listItems.ForEach(delegate(Item i) { i.IsHit = false; });
快于:
foreach (Item i in listItems)
{
i.IsHit = false;
}
这怎么可能?
我试着看IL,但那只是我头上的方式......我只看到代表的结果行数较少,无论如何。
有没有机会将“命中”列表更改为哈希表?通过去除第二个for循环将大大提高性能。 – 2009-09-16 08:20:39