gpt4 book ai didi

c# - 在从头构建的链表上用 C# 实现 IEnumerable

转载 作者:太空狗 更新时间:2023-10-30 00:23:12 25 4
gpt4 key购买 nike

我从头开始用 C# 构建了一个链表,并进行了可靠的单元测试覆盖以确保它正常工作。

为了轻松比较具有大量值的链表,我使用标准 while CurrentNode.Next != null 手动“枚举”值,先进的技术并将这些值存储在 C# 列表或数组中。

我想在我的自定义 LinkedList 类上实现 IEnumerable,而不是依赖于从私有(private)后备集合中获取枚举器。

这是我的 LinkedList 类的代码。我觉得我忽略了一些简单的事情,因为枚举器应该只是您从集合类中获得的一个对象,据我所知,它提供了一个起点和一个 next 方法。我只是无法让它以通用方式工作。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpLibrary.DataStructures.LinkedLists
{
public class LinkedList<T> : IEnumerable<T>
{
public Node<T> First { get; private set; }
public Node<T> Current { get; set; }

public LinkedList(T initialValue)
{
First = new Node<T>(initialValue);
}

public void AddNodeToEnd(T value)
{
Node<T> last = GetLastNode();
last.Next = new Node<T>(value);
}

public Node<T> GetLastNode()
{
Node<T> last = First;
Node<T> current = First;
while (current.Next != null)
{
last = current.Next;
current = current.Next;
}
return current;
}


public void Reset()
{
Current = First;
}

public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}

IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
}

最佳答案

要添加到 Bradley 的答案中,请注意返回 IEnumerator<T> 的方法还支持 yield关键词:

public class LinkedList<T> : IEnumerable<T>
{
...

// this will automagically create the
// appropriate class for you
public IEnumerator<T> GetEnumerator()
{
Node<T> current = First;
while (current != null)
{
yield return current.Value;
current = current.Next;
}
}

IEnumerator IEnumerable.GetEnumerator()
{
// this will invoke the public generic
// version, so there is no recursion
return this.GetEnumerator();
}
}

但是,您应该删除 CurrentReset()来自父类,他们不属于那里。还有你的GetLastNode()方法有两个重复变量,您可以删除其中一个。

关于c# - 在从头构建的链表上用 C# 实现 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42845416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com