好的,所以我正在进行编程练习,我必须为FIFO链接列表编写自己的实现。我有一套我试图满足的单元测试。到目前为止,我的实施工作得相当好。然而,我面临的问题是Next属性。
在Unittests中,他们希望能够像这样调用Next属性。
List.Next.Next.Value
List.Next.Value
等。如果有人调用Next,我的实现将返回整个类实例,但是当有人在多个语句中调用Next时,第二个语句将不再具有新实例并且测试失败。
我的实施:
using System.Collections;
using System.Collections.Generic;
public class SimpleLinkedList<T> : IEnumerable<T>
{
public class Node
{
public T Data { get; set; }
public Node Next { get; set; }
}
private Node First = null;
private Node Last = null;
public SimpleLinkedList(T value)
{
AddNode(value);
}
public SimpleLinkedList(IEnumerable<T> values)
{
foreach (var value in values)
{
AddNode(value);
}
}
public T Value {
get {
return First != null ? First.Data : default(T);
}
}
public SimpleLinkedList<T> Next {
get {
if (First.Next != null)
{
First = First.Next;
return this;
}
return null;
}
}
public SimpleLinkedList<T> Add(T value)
{
AddNode(value);
return this;
}
public IEnumerator<T> GetEnumerator()
{
var current = First;
while (current.Next != null)
{
yield return First.Data;
current = current.Next;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
void AddNode(T value)
{
Node _newNode = new Node() { Data = value };
if (First == null)
{
First = _newNode;
Last = First;
}
else
{
Last.Next = _newNode;
Last = Last.Next;
}
}
}
单元测试失败:
[Fact]
public void From_enumerable()
{
var list = new SimpleLinkedList<int>(new[] { 11, 7, 5, 3, 2 });
Assert.Equal(11, list.Value);
Assert.Equal(7, list.Next.Value);
Assert.Equal(5, list.Next.Next.Value);
Assert.Equal(3, list.Next.Next.Next.Value);
Assert.Equal(2, list.Next.Next.Next.Next.Value);
}
单元测试在断言5上失败。因为在它之前的语句中,已经调用了Next,并且已经改变了对象的状态。
我试过保持一个内部&#39;当前&#39;返回的财产而不是第一个。但后来我遇到了问题,我怎么知道何时重启Current? 我不知道如何从这里开始。