Вложенный цикл for является избыточным, и, в частности, сам вызов "remove" представляет еще один цикл for. В целом, ваша вторая оптимизированная версия имеет меньшую сложность по времени, чем первое решение, особенно когда много обращений.
Самое быстрое решение, вероятно, будет следующим:
foreach(var item in listItems)
item.IsHit = false;
foreach (int hitIndex in hits)
listItems[hitIndex - 1].IsHit = true;
Это позволяет избежать неэффективных вложенных циклов for и избежать затрат на использование метода .ForEach
, основанного на делегатах (это хороший метод, но не в коде, критичном к производительности). Он включает в себя настройку IsHit немного чаще, но большинство установщиков свойств тривиальны, и, таким образом, это, вероятно, не является узким местом. В любом случае быстрый микропроцессор служит хорошей проверкой работоспособности.
Только если IsHit
действительно медленный , следующее будет быстрее:
bool[] isHit = new bool[listItems.Count]; //default:false.
//BitArray isHit = new BitArray(listItems.Count);
//BitArray is potentially faster for very large lists.
foreach (int hitIndex in hits)
isHit [hitIndex - 1] = true;
for(int i=0; i < listItems.Count; i++)
listItems[i].IsHit = isHit[i];
Наконец, рассмотрите возможность использования массива, а не List<>
. Как правило, массивы работают быстрее, если вам не нужны методы вставки / удаления типа List<>
.
Ключевое слово var
- это C # 3.5, но его можно использовать в .NET 2.0 (в целом для новых языковых функций не требуются более новые версии библиотек, просто они наиболее полезны для этих новых библиотек). Конечно, вы знаете тип, для которого List<>
специализирован, и можете явно указать его.