【发布时间】:2010-11-28 17:33:54
【问题描述】:
我正在尝试找到一种快速的方法来设置通用列表中每个项目的特定属性。
基本上,要求是遍历项目列表并将 IsHit 属性重置为 FALSE。之后只有第二个“命中”列表中的项目应设置为 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 循环将大大提高性能。
标签: c# performance search list