如何修复从列表中选择元素的递归方法
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很符合你的需求。
问题是我想 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很符合你的需求。