ADN Open CIS
Сообщество программистов Autodesk в СНГ

30/09/2015

Перечисление элементов

Очень много людей используют FilteredElementCollector, например, вот так:

Код - C#: [Выделить]
  1.   FilteredElementCollector collector
  2.     = new FilteredElementCollector( doc );
  3.  
  4.   collector.OfClass( typeof( Family ) ).ToElements();
  5.  
  6.   IEnumerable<Family> nestedFamilies
  7.     = collector.ToElements().Cast<Family>();
  8.  
  9.   String str = "";
  10.  
  11.   foreach( Family f in nestedFamilies )
  12.   {
  13.     str = str + f.Name + "\n";
  14.  
  15.     foreach( ElementId symbolId in
  16.       f.GetFamilySymbolIds() )
  17.     {
  18.       Element symbolElem = doc.GetElement(
  19.         symbolId );
  20.  
  21.       str = str + " типоразмер: "
  22.         + symbolElem.Name + "\n";
  23.     }
  24.   }

Пожалуйста, прекратите так делать.

Я уже тысячу раз объяснял, что тоже самое можно сделать гораздо проще, компактнее и более эффективным.

Вы можете проходить по элементам напрямую используя объект FilteredElementCollector. Короче говоря, нет необходимости создавать его копию.

Вызывая метод ToElements(), вы создаете копию объекта, тратя при этом драгоценную память и время.

Также нет необходимости приведения типа, так как оператор foreach сделает это автоматически.

Пример кода выше, можно легко сократить до такого состояния:

Код - C#: [Выделить]
  1.   FilteredElementCollector families
  2.     = new FilteredElementCollector( doc )
  3.       .OfClass( typeof( Family ) );
  4.  
  5.   foreach( Family f in families )
  6.   {
  7.     str = str + f.Name + "\n";
  8.  
  9.     // ...
  10.   }

Для того, чтобы в дальнейшем ссылаться на этот пример, я добавил этот код в примеры 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