C\#선형 노드 링크 집합 을 어떻게 사용자 정의 합 니까?
using System;
using System.Collections;
using System.Collections.Generic;
namespace LineNodeDemo
{
class Program
{
static void Main(string[] args)
{
LineNodeCollection lineNodes = new LineNodeCollection();
lineNodes.Add(new LineNode("N1") { Name = "Microsoft" });
lineNodes.Add(new LineNode("N2") { Name = "Lenovo" });
lineNodes.Add(new LineNode("N3") { Name = "Apple" });
lineNodes.Add(new LineNode("N4") { Name = "China Mobile" });
Console.WriteLine("1、 :");
lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
Console.WriteLine("2、 N2 :");
lineNodes.Remove("N2");
lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
Console.WriteLine("3、 1 :");
lineNodes.RemoveAt(1);
lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
Console.WriteLine("4、 0 :");
Console.WriteLine(lineNodes[0].Name);
Console.WriteLine("5、 N4 :");
Console.WriteLine(lineNodes["N4"].Name);
Console.WriteLine("6、 ");
lineNodes.Clear();
lineNodes.ForEach(x => { Console.WriteLine(x.Name); });
Console.ReadKey();
}
}
static class Utility
{
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
foreach(var r in source)
{
action(r);
}
}
}
class LineNodeCollection : IEnumerable<LineNode>
{
public IEnumerator<LineNode> GetEnumerator()
{
return new LineNodeEnumerator(this.firstLineNode);
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
public LineNode this[int index]
{
get
{
LineNode _lineNode= this.firstLineNode;
for (int i=0;i<=index;i++)
{
if (_lineNode != null)
{
if(i<index)
{
_lineNode = _lineNode.Next;
continue;
}
else
{
return _lineNode;
}
}
else break;
}
throw new IndexOutOfRangeException(" ");
}
}
public LineNode this[string id]
{
get
{
LineNode _lineNode = this.firstLineNode;
for (int i = 0; i < this.Count; i++)
{
if(_lineNode.ID == id)
{
return _lineNode;
}
else
{
_lineNode = _lineNode.Next;
}
}
throw new IndexOutOfRangeException(" ");
}
}
LineNode firstLineNode;
LineNode lastLineNode;
public void Add(LineNode lineNode)
{
this.Count++;
if(this.firstLineNode == null)
{
this.firstLineNode = lineNode;
}
else
{
if (this.firstLineNode.Next == null)
{
lineNode.Previous = this.firstLineNode;
this.firstLineNode.Next = lineNode;
this.lastLineNode = this.firstLineNode.Next;
}
else
{
lineNode.Previous = this.lastLineNode;
this.lastLineNode.Next = lineNode;
this.lastLineNode = this.lastLineNode.Next;
}
}
}
public int Count
{
private set;get;
}
public int IndexOf(string id)
{
LineNode _lineNode = this.firstLineNode;
for (int i = 0; i < this.Count; i++)
{
if (_lineNode.ID == id)
{
return i;
}
else
{
_lineNode = _lineNode.Next;
}
}
throw new IndexOutOfRangeException(" ");
}
public void Clear()
{
this.firstLineNode = null;
this.lastLineNode = null;
this.Count = 0;
this.GetEnumerator().Reset();
}
public void RemoveAt(int index)
{
if (this.Count < index) throw new InvalidOperationException(" ");
LineNode _currentLineNode = this[index];
if (_currentLineNode.Previous == null)
{
_currentLineNode = _currentLineNode.Next;
this.firstLineNode = _currentLineNode;
}
else
{
LineNode _lineNode = this.firstLineNode;
for (int i = 0; i <= index - 1; i++)
{
if (i < index - 1)
{
_lineNode = _lineNode.Next;
continue;
}
if (i == index - 1)
{
if (_currentLineNode.Next != null)
{
_lineNode.Next = _lineNode.Next.Next;
}
else
{
this.lastLineNode = _lineNode;
_lineNode.Next = null;
}
break;
}
}
}
this.Count--;
}
public void Remove(string id)
{
int _index = this.IndexOf(id);
this.RemoveAt(_index);
}
public LineNode TopLineNode { get { return this.firstLineNode; } }
public LineNode LastLineNode { get { return this.lastLineNode; } }
}
class LineNodeEnumerator : IEnumerator<LineNode>
{
LineNode topLineNode;
public LineNodeEnumerator(LineNode topLineNode)
{
this.topLineNode = topLineNode;
}
public LineNode Current
{
get
{
return this.lineNode;
}
}
object IEnumerator.Current
{
get
{
return this.Current;
}
}
public void Dispose()
{
this.lineNode = null;
}
LineNode lineNode;
public bool MoveNext()
{
if(this.lineNode == null)
{
this.lineNode = this.topLineNode;
if (this.lineNode == null) return false;
if (this.lineNode.Next == null)
return false;
else
return true;
}
else
{
if(this.lineNode.Next !=null)
{
this.lineNode = this.lineNode.Next;
return true;
}
return false;
}
}
public void Reset()
{
this.lineNode = null;
}
}
class LineNode
{
public LineNode(string id)
{
this.ID = id;
}
public string ID { private set; get; }
public string Name {set; get; }
public LineNode Next { set; get; }
public LineNode Previous { set; get; }
}
}
주의:① 여기 서 이른바 선형 노드 지정 은 모든 노드 간 에 관련 전후 노드 를 통 해 링크 를 형성 하 는 노드 이다.
② 본 예 는 블 로 거들 이 창작 한 것 이 므 로 전재 할 때 밝 혀 주 십시오.
실행 결 과 는 다음 과 같 습 니 다.
예제 다운로드 주소:C\#사용자 정의 선형 노드 링크 집합
(VS 2015 로 열 어 주 십시오.다른 버 전이 라면 Program.cs 의 내용 을 자신 이 만 든 콘 솔 프로그램 에 복사 하 십시오)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.