Я нахожу, что использование ключевого слова var на самом деле делает код более читаемым, потому что Вы просто привыкаете к пропуску ключевого слова 'var'. Вы не должны продолжать прокручивать право выяснить то, что делает код, когда Вы действительно не заботитесь о том, каков определенный тип. Если я действительно должен знать то, что тип 'объект' ниже, я просто толплюсь, моя мышь по нему и Visual Studio скажут мне. Другими словами, я очень читал бы
foreach( var item in list ) { DoWork( item ); }
много раз, чем
foreach( KeyValuePair<string, double> entry in list ) { DoWork( Item ); }
, когда я пытаюсь переварить код. Я думаю, что это сводится к персональному предпочтению в некоторой степени. Я полагался бы на здравый смысл на этом - сохраняют стандарты осуществления для важного материала (безопасность, использование базы данных, вход, и т.д.)
- Alan.
Общий подход к этой проблеме показывает, что индикатор выполнения меняется, но не обновляет фактический процент. Например, маленький значок загрузки в Firefox представляет собой кружок, который просто вращается - вы знаете, что он делает что-то , но вы не знаете, сколько времени это займет. Может быть, просто сделайте это и добавьте сообщение, что «это может занять некоторое время, в зависимости от объема данных ...»
Вы можете делать несколько вещей. Вы можете настроить структуру данных так, чтобы каждый узел хранил размер дерева с корнем в этом узле. Кроме этого:
Если деревья обычно большие, то отдельный прогон только для определения размера дерева может быть не очень хорошей идеей с точки зрения производительности (особенно, если дерево не полностью помещается в кеш) .
Если деревья в целом достаточно сбалансированы, то после обработки k -го поддерева из общего количества n поддеревьев, вы прошли приблизительно k / n * 100. процентов узлов. Вы можете использовать эти знания как меру прогресса.
Как насчет использования метки состояния, которая показывает, где вы находитесь, с помощью какого-либо дескриптора, который будет иметь смысл для пользователей, поскольку цикл выполняется выполнено ...
Например, если бы я просматривал организационную диаграмму, я бы знал, что мои конечные пользователи знакомы с большинством людей в организационной диаграмме, поэтому я бы использовал имена людей. В качестве примера, если я сообщу Бобу, который отчитывается перед Джо, который отчитывается перед Сью, когда моя запись обрабатывалась, метка сообщила бы что-то вроде ..
Currently processing Sue\Joe\Bob\David
Таким образом, вы обновляете текст метки состояния на каждом узле. Просто убедитесь, что вы вызываете Application.DoEvents () после изменения текста метки, чтобы экран обновился. Если вы действительно хотите показать, насколько далеко вы продвинулись, лучше подойдет индикатор выполнения, но этот вариант работал у меня в аналогичных ситуациях. Он дает некоторую обратную связь относительно того, что происходит, и опыт пользователя - это то, что действительно имеет значение.
Однако есть одно предостережение: обновление текста метки и вызов приложения.
Хороший индикатор выполнения будет основан на общем количестве узлов (путем рекурсивного подсчета). Раздражающим, но, возможно, более эффективным индикатором прогресса будет тот, который увеличивает MaxValue с каждым шагом рекурсии (делая ваши шаги прогресса меньше по мере продвижения). Эти методы можно объединить, сделав приблизительную оценку перед запуском метода и обновив его по ходу работы.
Я полагаю, что подход Microsoft заключается в использовании цикла от начала до конца в цикле. индикатор.