유형 매개 변수 T를 취하고 트리에 존재하는 T 유형의 모든 항목을 반환하는 트리 검색 메소드를 작성해야합니다. 이 일을 할 수있는 방법이 있습니까? 나는이 시점에서 효율성보다 우아함을 선호합니다 ...트리 구조에서 T 유형의 모든 객체 찾기 C#
답변
뭔가 :
foreach(MyCustomNodeClass item in rootNode.AllDescendantNodes<MyCustomNodeClass>())
{
...
}
:
internal static IEnumerable<T> AllDescendantNodes<T>(this TreeNode input)
where T class;
{
T current = null;
foreach (TreeNode node in input.Nodes)
if((current = node as T) != null)
{
yield return current;
foreach (var subnode in node.AllDescendantNodes<T>())
yield return subnode;
}
}
그런 다음 확장 방법으로 루트 노드에 대해이 부를 것이다을
당신의 나무가 일반이라고 가정합니다. 즉 Item<T>
입니다.
int count = yourTree.Count(p => p == typeof(T));
그렇지 않으면, 각 노드를 구문 분석하고 "item == typeof(T)
는"
글쎄, 내부적으로 방법을 통해 나무의 모든 요소를 반복해야 할 것입니다 비교, 그래서 스킵은 위에 열거하고 사용하기 OfType LINQ 방법은 멀지 않은 :
var onlyTs = yourTree.OfType<SomeT>();
정답을 주심 +1 : 그냥 포인트를 놓친 것을 깨달았습니다 –
는 당신이 필요로하는 기본적인 트리 탐색 기능입니다 (전순은, inorder를 또는 postorder -이 중요하지 않습니다) 및 필터 기능. 그럼 당신은 함께 두를 작성하고 당신이 필요로하는 것을 얻을 수 있습니다 :이 같은
IEnumerable<T> Traverse(Tree<T> tree)
{
yield return tree.Data;
foreach(Tree<T> subtree in tree.Subtrees)
foreach(T t in Traverse(subtree))
yield return t;
}
IEnumerable<U> Filter<T, U>(IEnumerable<T> source)
where U : T
{
foreach(T t in source)
if(t is U)
yield return (U)t;
}
내 생각은 비슷하지만 한 가지 변경을해야합니다. 두 번 변환을 수행하고 있습니다. - 't를 U로 설정하고 null을 확인하는 것이 더 빠릅니다. 수업보다 'if (t is U) (U) t'; – Keith
- 1. 객체 그래프에서 특정 유형의 객체 찾기
- 2. 모든 유형의 배열을 List로 변환합니다. <T> (C#)
- 3. C : 모든 유형의 포인터?
- 4. 트리 구조에서 트리, 노드, 리프의 이름을 지정하는 방법은 무엇입니까?
- 5. C#에서 트리 노드 찾기 및 바꾸기
- 6. Java의 트리 구조에서 파일을 피할 수있는 방법
- 7. C++ 간격 트리 알고리즘 구현 찾기
- 8. 동일한 유형의 컨트롤 찾기
- 9. 연관된 has_many 객체가없는 모든 객체 찾기
- 10. C++에서 추상 유형의 생성자에 객체 전달
- 11. 트리 루트 찾기
- 12. Android - 트리 구조에서 데이터를 표현하고 트래버스하는 가장 좋은 방법
- 13. C 기반 구조에서 C++ 통합
- 14. VS에서 객체 트리 시각화
- 15. 자바의 GUI 계층 구조에서 구성 요소 찾기
- 16. 관리되는 유형의 전역 객체
- 17. T-SQL에서 일 찾기
- 18. 커밋 자식에서 모든 객체의 SHA1 찾기
- 19. 대상 비용으로 스패닝 트리 찾기
- 20. 같은 인터페이스로 다른 유형의 객체 전달하기
- 21. CakePHP 트리에서 서브 트리 찾기
- 22. 이름으로 객체 찾기
- 23. java arraylist에서 중복 객체 찾기
- 24. div 내에서 모든 유형의 첫 번째 포커스가있는 항목 찾기
- 25. 트리 데이터 구조에서 중복 섹션을 찾을 수있는 도구가 있습니까?
- 26. 문자열 속성별로 빨리 찾기 객체
- 27. 공유 트리 데이터 구조에서 스레드 동기화를 어떻게 처리해야합니까?
- 28. 반복적으로 객체 (트리)를 반복합니다
- 29. Java의 객체 트리 탐색 언어
- 30. C에서 특정 유형의 멤버 필드 찾기
그게 나를 위해 작동합니다. 나는 아직 확장 방법에 대한 이해가 없으므로 그것이 효과적인지 여부에 대해서는 확신 할 수 없다. 그러나 그것은 우아한 해결책입니다. 내가보기에 주어진 입력의 자손 만 검사됩니다. AllDescendants를 수정하여 입력 노드 유형을 확인하고이를 산출해야했습니다. 고마워요 –
사실, 나는 특별한 루트 노드를 만든 다음 그것을 전달해야했습니다. AllDescendants를 수정하는 것은 잘못되었습니다. 감사합니다. –
확장 메소드는 컴파일 타임에 정상 정적 호출로 변환됩니다. 사용시 성능에 영향을 미치지 않습니다. 이 메서드는 재귀를 처리하므로 잠재적으로 트리의 루트 노드에서 작업 한 다음 비슷한 작업을 수행합니다. – Keith