LinkedList队列到整数列表方法C#

时间:2017-12-05 20:14:36

标签: c# asp.net

我有两个表示队列的链表实现的类。最终,我希望能够将队列的对象绑定到列表(以便能够将其绑定到gird视图)。

但是,尝试在方法中使用foreach将不起作用,因为“队列没有GetEnumerator的公共定义”。

我需要基类(队列)中的一个方法,该方法将以数组/列表的形式返回所有节点的数据项。

非常感谢任何帮助。

public class Queue
{
    private Node Head;
    private Node Tail;
    private int Count = 0;
    public Queue() { }
    public void Enqueue(int OrderID)
    {
        Node newNode = new Node(OrderID);
        if (Head == null)
        {
            Head = newNode;
            Tail = Head;
        }
        else
        {
            Tail.Next = newNode;
            Tail = Tail.Next;
        }
        Count++;
    }
    public int Dequeue()
    {
        if (Head == null)
        {
            throw new Exception("Nothing in queue.");
        }
        int Result = Head.OrderID;
        Head = Head.Next;
        return Result;
    }

    public int getCount()
    {
        return Count;
    }

}


public class Node
{
    public int OrderID { get; set; }
    public Node Next { get; set; }
    public Node(int ID)
    {
        this.OrderID = ID;
    }
}

2 个答案:

答案 0 :(得分:2)

您只需实现 IEnumerable 界面:

public class Queue<T> : IEnumerable<T>
{
    private Node _head;
    private Node _tail;
    private int _count = 0;
    public void Enqueue(T value)
    {
        Node newNode = new Node(value);
        if (_head == null)
        {
            _head = newNode;
            _tail = _head;
        }
        else
        {
            _tail.Next = newNode;
            _tail = _tail.Next;
        }
        _count++;
    }
    public T Dequeue()
    {
        if (_head == null)
        {
            throw new Exception("Nothing in queue.");
        }
        var result = _head.Value;
        _head = _head.Next;
        _count--;
        return result;
    }

    public int GetCount()
    {
        return _count;
    }

    private class Node
    {
        public readonly T Value;
        public Node Next { get; set; }
        public Node(T value)
        {
            Value = value;
        }
    }

    public IEnumerator<T> GetEnumerator()
    {
        var iter = _head;
        while (iter != null)
        {
            yield return iter.Value;
            iter = _head.Next;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

然后在代码中:

var queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(100);

foreach(var item in queue)
{
   Console.WriteLine(item);
}

PS:另外,在Dequeue上使用GetCount()方法修复了错误。

答案 1 :(得分:1)

您可以创建递归方法来执行它。

    public List<Node> GetAllNodes()
    {
        var allNodes = new List<Node>();
        GetAllNodesRecursive(allNodes, Head);
        return allNodes;
    }

    private void GetAllNodesRecursive(List<Node> allNodes, Node node)
    {
        if (node == null)
        {
            return;
        }
        allNodes.Add(node);
        GetAllNodesRecursive(allNodes, node.Next);
    }

用法

        var queue = new Queue();
        queue.Enqueue(1);
        queue.Enqueue(2);
        queue.Enqueue(4);
        var nodeList = queue.GetAllNodes();

检索OrderId整数列表;

var orderIDList = queue.GetAllNodes().Select(x => x.OrderId).ToList();