List<Element> eles = new List<Element>(); //过滤项目中的标高 eles=new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).ToList(); eles=new FilteredElementCollector(doc).OfClass(typeof(HostObject)).ToList();第二次过滤的构件把第一次过滤的构件覆盖了,如何将两次过滤给构件合并起来放在一个集合里
时间: 2024-03-11 20:51:18 浏览: 70
你可以使用 LINQ 的 `Union` 方法将两个 `List<Element>` 合并成一个,代码如下:
```
List<Element> allEles = new List<Element>();
List<Element> firstEles = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).ToList();
List<Element> secondEles = new FilteredElementCollector(doc).OfClass(typeof(HostObject)).ToList();
allEles = firstEles.Union(secondEles).ToList();
```
这里的 `Union` 方法会自动去重,保证合并后的集合中不会有重复的元素。
相关问题
FilteredElementCollector col = new FilteredElementCollector(doc); eles = col.OfClass(typeof(FamilyInstance)).ToList(); eles = col.OfClass(typeof(HostObject)).ToList();为什么eles为空
这是因为你在创建 `FilteredElementCollector` 对象时并没有指定筛选条件,而后面又对 `col` 对象进行了多次筛选,这样会导致第一次筛选时的结果被覆盖。你可以使用 `WherePasses` 方法在一次筛选中同时指定多个筛选条件,例如:
```
FilteredElementCollector col = new FilteredElementCollector(doc);
IList<Element> eles = col.WherePasses(new ElementClassFilter(typeof(FamilyInstance)))
.WherePasses(new ElementClassFilter(typeof(HostObject)))
.ToList();
```
这样就可以同时筛选出 `FamilyInstance` 和 `HostObject` 类型的元素了。
FilteredElementCollector col = new FilteredElementCollector(doc); eles = col.WherePasses(new ElementClassFilter(typeof(FamilyInstance))).WherePasses(new ElementClassFilter(typeof(HostObject))).ToList(); foreach (Element ele in eles) { FamilyInstance instance=ele as FamilyInstance; Parameter parn=instance.get_Parameter(BuiltInParameter.ELEM_FAMILY_PARAM); string fname=parn.AsValueString(); if(s.Contains(fname)==false) { s.Add(fname); //familyname += s + "\n"; } } foreach (string item in s) { TaskDialog.Show("提示",item); }。为上面eles还是为空
上面的代码中,如果`eles`是空的,那么可能是因为当前文档中不存在`FamilyInstance`和`HostObject`类型的元素,或者筛选条件不正确导致没有符合条件的元素被选中。你可以尝试在代码中加入一些调试信息,例如在第一行代码后添加`TaskDialog.Show("提示", "开始筛选元素");`,以便定位问题所在。另外,你可以尝试更改筛选条件或者使用其他的API方法来获取需要的元素。
阅读全文