첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

TestProject.zip
0.01MB

▶ TreeNode.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace TestProject
{
    /// <summary>
    /// 트리 노드 클래스
    /// </summary>
    /// <typeparam name="TNode">노드 타입</typeparam>
    public class TreeNode<TNode> : IEnumerable<TreeNode<TNode>>
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 부모 노드 - ParentNode

        /// <summary>
        /// 부모 노드
        /// </summary>
        public TreeNode<TNode> ParentNode { get; set; }

        #endregion
        #region 데이터 - Data

        /// <summary>
        /// 데이터
        /// </summary>
        public TNode Data { get; set; }

        #endregion
        #region 자식 컬렉션 - ChildCollection

        /// <summary>
        /// 자식 컬렉션
        /// </summary>
        public ICollection<TreeNode<TNode>> ChildCollection { get; set; }

        #endregion

        #region 루트 노드 여부 - IsRootNode

        /// <summary>
        /// 루트 노드 여부
        /// </summary>
        public bool IsRootNode
        {
            get
            {
                return ParentNode == null;
            }
        }

        #endregion
        #region 말단 노드 여부 - IsLeafNode

        /// <summary>
        /// 말단 노드 여부
        /// </summary>
        public bool IsLeafNode
        {
            get
            {
                return ChildCollection.Count == 0;
            }
        }

        #endregion

        #region 레벨 - Level

        /// <summary>
        /// 레벨
        /// </summary>
        public int Level
        {
            get
            {
                if(IsRootNode)
                {
                    return 0;
                }

                return ParentNode.Level + 1;
            }
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 노드 컬렉션 - NodeCollection

        /// <summary>
        /// 노드 컬렉션
        /// </summary>
        private ICollection<TreeNode<TNode>> NodeCollection { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - TreeNode(data)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="data">데이터</param>
        public TreeNode(TNode data)
        {
            Data = data;

            ChildCollection = new LinkedList<TreeNode<TNode>>();

            NodeCollection = new LinkedList<TreeNode<TNode>>();

            NodeCollection.Add(this);
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 자식 노드 추가하기 - AddChildNode(childData)

        /// <summary>
        /// 자식 노드 추가하기
        /// </summary>
        /// <param name="childData">자식 데이터</param>
        /// <returns>추가 자식 노드</returns>
        public TreeNode<TNode> AddChildNode(TNode childData)
        {
            TreeNode<TNode> childNode = new TreeNode<TNode>(childData) { ParentNode = this };

            ChildCollection.Add(childNode);

            RegisterChildNodeForSearch(childNode);

            return childNode;
        }

        #endregion
        #region 트리 노드 찾기 - FindTreeNode(predicateFunction)

        /// <summary>
        /// 트리 노드 찾기
        /// </summary>
        /// <param name="predicateFunction">서술 함수</param>
        /// <returns>트리 노드</returns>
        public TreeNode<TNode> FindTreeNode(Func<TreeNode<TNode>, bool> predicateFunction)
        {
            return this.NodeCollection.FirstOrDefault(predicateFunction);
        }

        #endregion

        #region 열거자 구하기 - GetEnumerator()

        /// <summary>
        /// 열거자 구하기
        /// </summary>
        /// <returns>열거자</returns>
        public IEnumerator<TreeNode<TNode>> GetEnumerator()
        {
            yield return this;

            foreach(TreeNode<TNode> childNode in ChildCollection)
            {
                foreach(TreeNode<TNode> grandChildNode in childNode)
                {
                    yield return grandChildNode;
                }
            }
        }

        #endregion
        #region (IEnumerable) 열거자 구하기 - GetEnumerator()

        /// <summary>
        /// 열거자 구하기
        /// </summary>
        /// <returns>열거자</returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion

        #region 문자열 구하기 - ToString()

        /// <summary>
        /// 문자열 구하기
        /// </summary>
        /// <returns>문자열</returns>
        public override string ToString()
        {
            return Data != null ? Data.ToString() : "[NULL]";
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 조회용 자식 노드 등록하기 - RegisterChildNodeForSearch(childNode)

        /// <summary>
        /// 조회용 자식 노드 등록하기
        /// </summary>
        /// <param name="childNode">자식 노드</param>
        private void RegisterChildNodeForSearch(TreeNode<TNode> childNode)
        {
            NodeCollection.Add(childNode);

            if(ParentNode != null)
            {
                ParentNode.RegisterChildNodeForSearch(childNode);
            }
        }

        #endregion
    }
}

 

300x250

 

▶ SampleData.cs

namespace TestProject
{
    /// <summary>
    /// 샘플 데이터
    /// </summary>
    public class SampleData
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 샘플 트리 노드 구하기 - GetSampleTreeNode()

        /// <summary>
        /// 샘플 트리 노드 구하기
        /// </summary>
        /// <returns>샘플 트리 노드</returns>
        public static TreeNode<string> GetSampleTreeNode()
        {
            TreeNode<string> rootNode = new TreeNode<string>("루트 노드");
            {
                TreeNode<string> node0 = rootNode.AddChildNode("노드 0");
                TreeNode<string> node1 = rootNode.AddChildNode("노드 1");
                TreeNode<string> node2 = rootNode.AddChildNode("노드 2");
                {
                    TreeNode<string> node20 = node2.AddChildNode(null);
                    TreeNode<string> node21 = node2.AddChildNode("노드 21");
                    {
                        TreeNode<string> node210 = node21.AddChildNode("노드 210");
                        TreeNode<string> node211 = node21.AddChildNode("노드 211");
                    }
                }
                TreeNode<string> node3 = rootNode.AddChildNode("노드 3");
                {
                    TreeNode<string> node30 = node3.AddChildNode("노드 30");
                }
            }

            return rootNode;
        }

        #endregion
    }
}

 

728x90

 

▶ Program.cs

using System;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 들여쓰기 문자열 구하기 - GetIndentString(level, indentCharacter)

        /// <summary>
        /// 들여쓰기 문자열 구하기
        /// </summary>
        /// <param name="level">레벨</param>
        /// <param name="indentCharacter">들여쓰기 문자</param>
        /// <returns>들여쓰기 문자열</returns>
        private static string GetIndentString(int level, string indentCharacter = " ")
        {
            return indentCharacter.PadLeft(level * 4).Substring(1);
        }

        #endregion
        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            TreeNode<string> rootNode = SampleData.GetSampleTreeNode();

            Console.WriteLine("노드 리스트");
            Console.WriteLine("--------------------------------------------------");

            foreach(TreeNode<string> node in rootNode)
            {
                Console.WriteLine($"{GetIndentString(node.Level)}{node.Data ?? "null"}");
            }

            Console.WriteLine("--------------------------------------------------");
            Console.WriteLine();

            TreeNode<string> targetNode = rootNode.FindTreeNode(node => node.Data != null && node.Data.Contains("210"));

            Console.WriteLine($"조회 노드 : {targetNode}");
        }

        #endregion
    }
}
728x90
그리드형(광고전용)
Posted by icodebroker
,