выдалась свободная минутка, решил посчитать, сколько эти способы будут выполняться по времени.
в тестовом проекте 30 уровней, на каждом 9 помещений.
вот такие получились выводы:
1. При каждом запуске время выполнения всегда разное. Я не знаю, что на это влияет, Ревит, CLR, DateTime...
2. Ожидаемо, нэйтив ощутимо быстрее.
3. Неожиданно, если вынести создание collector из цикла, время выполнения нэйтив-варианта вырастает в среднем до 150 мс. Видимо, магия оптимизации, какая-то.
![](https://i.postimg.cc/5HfzdsjF/2.jpg)
Document Doc = this.ActiveUIDocument.Document;
// linq
var startTime = DateTime.Now;
var allRooms = new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Rooms);
foreach(Level lv in new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType())
{
var rooms = allRooms
.Where(r => r.LevelId.Equals(lv.Id))
.Cast<Room>().ToList();
}
string linqTime = DateTime.Now.Subtract(startTime).Milliseconds.ToString();
// native
startTime = DateTime.Now;
foreach(Level lv in new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType())
{
var levelRule = ParameterFilterRuleFactory.CreateEqualsRule(new ElementId(BuiltInParameter.ROOM_LEVEL_ID), lv.Id);
var filter = new LogicalAndFilter(new ElementCategoryFilter(BuiltInCategory.OST_Rooms), new ElementParameterFilter(levelRule));
var collector = new FilteredElementCollector(Doc);
var rooms = collector.WherePasses(filter).Cast<Room>().ToList();
}
string nativeTime = DateTime.Now.Subtract(startTime).Milliseconds.ToString();;
// if
startTime = DateTime.Now;
var allRooms2 = new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Rooms);
foreach(Level lv in new FilteredElementCollector(Doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType())
{
List<Room> rms = new List<Room>();
foreach(Room r in allRooms2)
if(r.LevelId.Equals(lv.Id))rms.Add(r);
}
string ifTime = DateTime.Now.Subtract(startTime).Milliseconds.ToString();
TaskDialog.Show("!", String.Format("LINQ time: {0}\r\nNATIVE time: {1}\r\nIF time: {2}",
linqTime,
nativeTime,
ifTime
));