Перечисление элементов
Очень много людей используют FilteredElementCollector, например, вот так:
- FilteredElementCollector collector
- = new FilteredElementCollector( doc );
- collector.OfClass( typeof( Family ) ).ToElements();
- IEnumerable<Family> nestedFamilies
- = collector.ToElements().Cast<Family>();
- String str = "";
- foreach( Family f in nestedFamilies )
- {
- str = str + f.Name + "\n";
- foreach( ElementId symbolId in
- f.GetFamilySymbolIds() )
- {
- Element symbolElem = doc.GetElement(
- symbolId );
- str = str + " типоразмер: "
- + symbolElem.Name + "\n";
- }
- }
Пожалуйста, прекратите так делать.
Я уже тысячу раз объяснял, что тоже самое можно сделать гораздо проще, компактнее и более эффективным.
Вы можете проходить по элементам напрямую используя объект FilteredElementCollector. Короче говоря, нет необходимости создавать его копию.
Вызывая метод ToElements(), вы создаете копию объекта, тратя при этом драгоценную память и время.
Также нет необходимости приведения типа, так как оператор foreach сделает это автоматически.
Пример кода выше, можно легко сократить до такого состояния:
- FilteredElementCollector families
- = new FilteredElementCollector( doc )
- .OfClass( typeof( Family ) );
- foreach( Family f in families )
- {
- str = str + f.Name + "\n";
- // ...
- }
Для того, чтобы в дальнейшем ссылаться на этот пример, я добавил этот код в примеры The Building Coder в метод IterateOverCollector модуля CmdCollectorPerformance.cs
Источник: http://thebuildingcoder.typepad.com/blog/2015/09/change-type-iterate-elements-create-family.html#3
Обсуждение: http://adn-cis.org/forum/index.php?topic=3061
Опубликовано 30.09.2015