如何修复从列表中选择元素的递归方法

时间:2019-05-02 05:28:04

标签: c# revit-api revit

问题是我想单击即可选择彼此重合的梁。我有一个代码检查它们是否已连接。在下面找到代码

  public bool ElementsConnect(Element firstelement, Element secondelement)
    {
       ElementGeometry geo= new ElementGeometry();
       bool istrue ;
       List<XYZ> firstendpoints = GetEndPoints(firstelement);
       List<XYZ> secondendpoints = GetEndPoints(secondelement); 
       return istrue = firstendpoints.Any(firspoint => secondendpoints.Any
       (secondpoint => secondpoint.X == firspoint.X && secondpoint.Y==firspoint.Y
       && secondpoint.Z==firspoint.Z));
    }

现在,我需要第二种方法以递归方式遍历列表以查找其他已加入的成员,直到没有成员为止。这是我无法找到解决方案的地方。帮助将不胜感激。让我补充一点,此代码永远不会超出循环范围。

 public List<Element> GetConnectedBeams(Element element, List<Element> elements)
    {
       List<Element> beams = new List<Element>();
       for(int i=0; i < elements.Count();  i++)
       {
          if(ElementsConnect( element,elements[i]))
             beams.Add(elements[i]);
       }    
       List<Element> eles = null;
       foreach (var beam in beams) 
       {
          Element ele= elements.Find(x=> beams.Contains(x));
          eles = elements.Where(x=> x!= ele).ToList();
          beams= GetConnectedBeams(beam,eles) ;                                 
       }                
       return beams;
    }

2 个答案:

答案 0 :(得分:0)

使用这一行代码

   for(int i=0; i < elements.Count();  i++)

您已经遍历了所有元素,因为您写过,您只想检查连接,直到没有剩下的为止。

还是我理解错了什么?

编辑:

那怎么样?

 while (beams.Any())
 {
    foreach (var beam in beams) 
    {
       Element ele= elements.Find(x=> beams.Contains(x));
       eles = elements.Where(x=> x!= ele).ToList();
       beams= GetConnectedBeams(beam,eles) ;                                 
    }  
 }

答案 1 :(得分:0)

The Building Coder反复讨论了如何检索连接的元素。也许Filtering for Touching Beams Using Solid Intersection上的文章可以很好地满足您的需求。