LINQ를 사용하여 트리 데이터 구조에서 레벨을 얻는 가장 좋은 방법은 무엇입니까?
이제이 컬렉션의 각 노드에 대해 level
를 얻으 려합니다. 다음 코드로 시도했지만 가장 좋은지 궁금합니다. 그것을 구현하는 방법.
Func<int, int> GetLevel = (nodeID) =>
{
int _level = 0;
var _node = source.First(p => p.Id == nodeID);
// while hasn't reached the root yet
while (_node .ParentID.HasValue)
{
_level++;
_node = source.First(p => p.Id == _node.ParentID);
}
return _level;
};
// source is a collection of Node.
var query = from node in source
select new
{
Id = node.Id,
Name = node.Name,
ParentID = node.ParentID,
Level = GetLevel(node.Id)
};
GetLevel
함수의 오버 헤드가 줄어들 수 있다고 생각합니다. 아니면이 기능없이 직접 가져 오는 것이 더 좋은 방법 일 것입니다!
어떤 생각이든!
foreach 루프에서'rootNode.All'을 실행하면 _Foreach 문이 group_ 메소드에서 작동하지 않습니다. 나는'All'이 Linq에게 해결할 것이라고 생각하지만 이것을 고치는 방법을 모른다. 참고로, 나는 여러 뿌리를 가지고 있으며, 그러므로 그들 모두에게 접근 할 방법을 찾고있다. 제네릭 메소드를 주셔서 감사합니다. 재귀 알고리즘을 반복적 인 알고리즘으로 변환하는 중대한 문제를 해결했습니다! – Vignesh
난으로 해결 (rootNode를 노드에 N) { 의 foreach (노드 n.SelfAndDescendants에 리터) '의 foreach { //l.Value.ID, l.Value.pID, l.Count (), 등 ...; }}'. 이것은 foreach 루프의 루트와 foreach 루프의 루트 아래의 모든 것을 반환합니다. –
Vignesh