J'essaie de trouver le moyen le plus rapide de définir une propriété spécifique de chaque élément d'une liste générique. Fondamentalement, l'exigence est d'itérer sur une liste d'éléments et de réinitialiser la propriété IsHit sur FALSE. Seuls les éléments d'une deuxième liste "hit" doivent être mis à TRUE par la suite.C# Valeur du paramètre de performance pour chaque élément de la liste
Ma première tentative ressemblait à ceci:
listItems.ForEach(delegate(Item i) { i.IsHit = false; });
foreach (int hitIndex in hits)
{
listItems[hitIndex - 1].IsHit = true;
}
Note: succès est basé sur 1, la liste des articles est base 0.
Alors j'ai essayé d'améliorer la vitesse et est venu avec ceci:
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;
}
}
Je sais que c'est un micro optimisation, mais il est vraiment temps de code sensible, donc il serait logique d'améliorer ce code au-delà readibility ... et juste pour le plaisir bien sûr ;-)
Malheureusement, je ne vois vraiment pas comment améliorer le code. Mais j'ai probablement manqué quelque chose.
Merci
PS: Code en C#/.NET 2.0 serait préférable. J'ai fini par passer à la solution Eamon Nerbonne. Mais j'ai remarqué quelque chose de bizarre dans mes benchmarks.
Le délégué:
listItems.ForEach(delegate(Item i) { i.IsHit = false; });
est plus rapide que:
foreach (Item i in listItems)
{
i.IsHit = false;
}
Comment est-ce possible?
J'ai essayé de regarder IL mais c'est juste au-dessus de ma tête ... Je vois seulement que les délégués obtiennent moins de lignes, peu importe ce que cela signifie.
une chance de changer la liste "hit" en hashtable? Cela améliorerait considérablement les performances en supprimant la deuxième boucle forcée. –