gpt4 book ai didi

每个列表项的 C# 性能设置值

转载 作者:太空宇宙 更新时间:2023-11-03 20:44:21 24 4
gpt4 key购买 nike

我正在尝试找到一种快速的方法来设置通用列表中每个项目的特定属性。

基本上,要求是遍历项目列表并将 IsHit 属性重置为 FALSE。之后只有第二个“命中”列表中的项目才应设置为 TRUE。

我的第一次尝试是这样的:

listItems.ForEach(delegate(Item i) { i.IsHit = false; });

foreach (int hitIndex in hits)
{
listItems[hitIndex - 1].IsHit = true;
}

注意:hits 从 1 开始,items list 从 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,但那只是我的头……我只看到委托(delegate)导致更少的行,不管那是什么意思。

最佳答案

你能把第二个列表中的项目放入字典吗?如果是这样,您可以这样做:

for( int i = 0; i < firstList.Count; i++ )
{
firstList[i].IsHit = false;

if( secondList.Contains (firstList[i].Id) )
{
secondList.Remove (firstList[i].Id);
firstList[i].IsHit = true;
}
}

其中 secondList 是 Dictionary offcourse。

通过将 hiSTList 的项目放入字典中,您可以使用 O(1) 操作检查该列表中是否包含项目。在上面的代码中,我使用某种 Item 的唯一标识符作为字典中的键。

关于每个列表项的 C# 性能设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com