Как исправить рекурсивный метод, который выбирает элементы из списка - PullRequest
1 голос
/ 02 мая 2019

Проблема в том, что я хочу выбрать лучи, совпадающие друг с другом, одним щелчком мыши.У меня есть код, который проверяет, связаны ли они.Найдите код ниже

  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 голосов
/ 02 мая 2019

Строительный кодер неоднократно обсуждал, как извлечь связанные элементы. Возможно, статья о Фильтрация касательных лучей с использованием сплошного пересечения вполне удовлетворит ваши потребности.

0 голосов
/ 02 мая 2019

С этой строкой кода

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

вы уже перебираете все элементы, потому что написали, что хотите проверять соединения, пока никого не осталось.

Или я что-то не так понимаю?

Edit:

Как насчет этого?

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