I'm uisng your workaround to filter all the legends placed on sheets and then delete the ones that are not on shets
//get all the sheets in the model
FilteredElementCollector vftCollector = new FilteredElementCollector(doc);
vftCollector.OfClass(typeof(ViewSheet));
//get all the Legends in the model FilteredElementCollector legCollector = new FilteredElementCollector(doc) .OfClass(typeof(View)); List<ElementId> allLegendsOnModelIdlist = new List<ElementId>(); foreach (ElementId eid in legCollector.ToElementIds()) { View v = doc.GetElement(eid) as View; if (v.ViewType == ViewType.Legend) allLegendsOnModelIdlist.Add(v.Id); } List<ElementId> allsLegendsOnsheetsId = new List<ElementId>(); foreach (ViewSheet vs in vftCollector) { //get all legends on sheet foreach (ElementId eid in vs.GetAllPlacedViews()) { View v = doc.GetElement(eid) as View; if (v.ViewType == ViewType.Legend) allsLegendsOnsheetsId.Add(v.Id); //TaskDialog.Show("Legend", "Found a legend named: " + v.Name + "\non sheet: " + vs.LookupParameter("Sheet Number").AsString()); } } var legendsToDelete = allLegendsOnModelIdlist.Except(allsLegendsOnsheetsId); toDelete.AddRange(legendsToDelete);