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
));