我有两个表示队列的链表实现的类。最终,我希望能够将队列的对象绑定到列表(以便能够将其绑定到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;
}
}
答案 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();