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

How To Fix A Recursive Method That Selects Elements from A List

问题是我想 select 只需单击一下即可使彼此重合的光束。我有一个代码可以检查它们是否已连接。找到下面的代码

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

现在我需要第二种方法来递归循环列表以找到其他加入的列表,直到有 none。这是我未能找到解决方案的地方。帮助将不胜感激。让我补充一点,这段代码永远不会脱离循环。

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

加上这行代码

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

The Building Coder has repeatedly discussed how to retrieve connected elements. Maybe the article on Filtering for Touching Beams Using Solid Intersection很符合你的需求。