出于教育目的,我必须在C#中开发一个非常基本的自制链表。它应该只能添加元素和其他一些花絮。我的主要问题是,与框架集合相比,添加和枚举操作真的很慢,我做错了什么,或者你不能用托管代码做得更好?
(枚举超过1000000个元素大约需要500毫秒,附加1000000个元素需要大约700毫秒)
internal class GenericBuffer<T> : IEnumerable<T>
{
protected class BufferNode
{
internal T Buffered { get; set; }
internal BufferNode Next { get; set; }
internal BufferNode(T buffered)
{
this.Buffered = buffered;
this.Next = null;
}
}
protected BufferNode First { get; set; }
protected BufferNode Last { get; set; }
public int Count { get; protected set; }
internal GenericBuffer()
{
this.First = null;
this.Last = null;
this.Count = 0;
}
internal void Append(T toBuffer)
{
if (this.First == null)
{
this.First = this.Last = new BufferNode(toBuffer);
}
else
{
this.Last.Next = new BufferNode(toBuffer);
this.Last = this.Last.Next;
}
this.Count++;
}
internal bool PullHead(out T head)
{
if (this.First == null)
{
head = default(T);
return false;
}
else if (this.First == this.Last)
{
head = this.Last.Buffered;
this.First = null;
this.Last = null;
this.Count--;
return true;
}
else
{
head = this.First.Buffered;
this.First = this.First.Next;
this.Count--;
return true;
}
}
public IEnumerator<T> GetEnumerator()
{
var currentNode = this.First;
while (currentNode != null)
{
yield return currentNode.Buffered;
currentNode = currentNode.Next;
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
感谢您就该主题提出的任何建议和提示。 :)
答案 0 :(得分:2)
List<T>
的实现可以通过Reference Source与大多数.NET框架一起在线获取,因此我强烈建议您检查一下并将其与您的实现进行比较。
通常,托管语言旨在使更高级别的功能更易于实现和维护,权衡是优化更难实现,而其他明智的简单,低级指针交互(如链表)可能会变得更加沉重在托管代码中。
此外,请务必引用与您测试过的其他实施相比较的一些比较时间。