Filter for Hosted Elements

Today was the last day of the Revit programming training here in Barcelona. One of the items we examined is yesterday's suggestion to use API filtering and the HOST_ID_PARAM to select the doors and windows hosted by a specific wall. Here is a code snippet that implements this and displays the result in a message box:

ElementId id = wall.Id;
Type t = typeof( FamilyInstance );
BuiltInCategory bicd = BuiltInCategory.OST_Doors;
BuiltInCategory bicw = BuiltInCategory.OST_Windows;
BuiltInParameter bip = BuiltInParameter.HOST_ID_PARAM;
 
Autodesk.Revit.Creation.Filter cf = app.Create.Filter;
Filter f1 = cf.NewCategoryFilter( bicd );
Filter f2 = cf.NewCategoryFilter( bicw );
Filter f3 = cf.NewLogicOrFilter( f1, f2 );
 
Filter f4 = cf.NewTypeFilter( t );
Filter f5 = cf.NewLogicAndFilter( f3, f4 );
 
Filter f6 = cf.NewParameterFilter( bip,
  CriteriaFilterType.Equal, id );
 
Filter f7 = cf.NewLogicAndFilter( f5, f6 );
 
List<Element> hosted = new List<Element>();
doc.get_Elements( f7, hosted );
n = hosted.Count;
 
string s = string.Format(
  "Wall <{0} {1}> hosts {2} door"
  + " and window element{3}{4}\n",
  wall.Name, id.Value, n,
  ( ( 1 == n ) ? "" : "s" ),
  ( ( 0 == n ) ? "." : ":" ) );
 
foreach( FamilyInstance fi in hosted )
{
  s += string.Format( "\n  {0} {1} {2}",
    fi.Category.Name, fi.Name, fi.Id.Value );
}
MessageBox.Show( s, "Anfitrion" );

In case you are wondering, 'anfitrión' means 'host' in Spanish.