2017-12-05 17 views
0

私は、キューのリンクリスト実装を表す2つのクラスを持っています。最終的には、キューのオブジェクトをリストにバインドできるようにしたい(それを鳥瞰図にバインドできるようにする)。LinkedListキューを整数のリストにする方法C#

しかし、メソッドでforeachを使用しようとすると、 'Queueに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

ここに質問はありません。あなたの*具体的な質問は何ですか? –

+0

クラスのメソッドを、グリッドビューへのバインドと互換性があるように変更する方法はありますか? –

+1

注:既存のフレームワーククラスと一致するクラス名は避けてください。名前空間を使用して曖昧さを解消することはできますが、コード(迷惑)とコードの読み込み(フレームタイプではないことが必ずしも完全に分かっているわけではありません)の両方において、依然として破壊的です。 – Brian

答えて

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(); 
+0

現在のコンテキストで定義されていないgetAllNodesメソッドのHeadを呼び出す際に問題があるようです。 –

+0

これらのメソッドをQueueクラス内に定義しましたか? – lucky

+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:デキューのGetCountの()メソッドを持つ。また、固定しますエラーを。

+0

こんにちは、ありがとう、インターフェイスの定義に問題があるようです。IEnumerator IEnumerable.GetEnumerator()、エラーが発生しました。 "汎用タイプ 'System.Collections.Generic.IEnumerator 'を使用するには1が必要ですタイプ引数。 –

+0

あなたのファイルの上にusingsをタイプする:using System; using System.Collections; using System.Collections.Generic; – eocron

+0

もう一度、キューは必要なデータ項目を正しく追加できるようですが、データバインディングがメモリ不足例外に実行されます。 'mscorlib.dllで' System.OutOfMemoryException 'タイプの例外が発生しましたが、ユーザーコードで処理されませんでした' –

関連する問題