728x90
728x170
▶ 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
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON/.NET6] String 클래스 : 다중 공백 문자열을 단일 공백 문자열로 대체하기 (0) | 2022.07.28 |
---|---|
[C#/COMMON] Regex 클래스 : Replace 메소드를 사용해 다중 공백 문자열을 단일 공백 문자열로 대체하기 (0) | 2022.07.28 |
[C#/COMMON] DateTime 구조체 : 두 날짜 사이에서 개월 수 구하기 (0) | 2022.07.28 |
[C#/COMMON/.NET6] 배열 병합하기 (0) | 2022.07.28 |
[C#/COMMON/.NET6] Array 클래스 : CopyTo 메소드를 사용해 배열 병합하기 (0) | 2022.07.28 |
[C#/COMMON/.NET6] List<T> 클래스 : ConvertAll 메소드를 사용해 정수 문자열 리스트에서 정수 리스트 구하기 (0) | 2022.07.28 |
[C#/COMMON/.NET6] Uri 클래스 : TryCreate 정적 메소드를 사용해 URL에서 파일명 구하기 (0) | 2022.07.27 |
[C#/COMMON/.NET6] Uri 클래스 : TryCreate 정적 메소드를 사용해 URL에서 파일명 구하기 (0) | 2022.07.27 |
[C#/COMMON/.NET6] Uri 클래스 : IsFile 속성을 사용해 URI에서 파일명 구하기 (0) | 2022.07.27 |
[C#/COMMON/.NET6] Array 클래스 : GetLength 메소드를 사용해 다차원 배열 크기 구하기 (0) | 2022.07.27 |