2016-11-26 3 views
-4

INTRO:この回答をしばらく探していたが、いくつかの検索にもかかわらずアーカイブ内に見つかりませんでした。あまりにも単純な問題か、Cの法則を破るために何かをしている#二重リンクリスト内のオブジェクトから変数を返す

私は二重にリンクされたリストに新しく、彼らは私の頭をしています!

リスト内のオブジェクトから変数を吐き出すために、二重にリンクされたリストを取得する際に問題があります。

問題を新しいファイルで単純化して頭の中で解決しようとしましたが、DLL内のオブジェクト内の変数を見つけるための正しい構文が見つからないだけです。

私はDLL内の5つのオブジェクトに分割しました。各オブジェクトにはタイトルが付いています。 今、オブジェクトを見つけてタイトルを返すようにしたいと思います。 代わりに:aaaaaaaaaaaaaaaaaaarrrgh!私は間違って何してるの?

namespace ADS 
{ 
public partial class DLL_Generic_Object : Form 

{ 
    public DLL_Generic_Object() 
    { 
     InitializeComponent(); 
    } 

    //create class 

    public partial class Weapon 
    { 
     string Title; 

     public Weapon(string title) 
     {     
      this.Title = title;  
     } 

    } 

    //create objects; 

    Weapon object1 = new Weapon("Revolver"); 
    Weapon object2 = new Weapon("Candlestick"); 
    Weapon object3 = new Weapon("Lead Pipe"); 
    Weapon object4 = new Weapon("Rope"); 
    Weapon object5 = new Weapon("Knife"); 

    public class Structures 
    { 
     public string getTitle(LinkedList<Object> nameofDLL) 
     { 
      string gotTitle = "How do I Find the Title variable of an Object in the DLL?"; 

      return gotTitle; 
     } 
    } 

    //create an object Doubly Linked List 
    LinkedList<object> weapons = new LinkedList<object>(); 

    private void btnExecute_Click(object sender, EventArgs e) 
    { 
     PrintNodes(weapons); //This will show the DLL is empty. 

     //Add nodes to the list 
     weapons.AddFirst(object1); //add a node to the front of the list 

     //Add a node after a specific node. 
     weapons.AddAfter(weapons.Find(object1), object2); 
     weapons.AddAfter(weapons.Find(object2), object4); 

     //Add a node before a specific node. 
     weapons.AddBefore(weapons.Find(object4), object3); 

     //Add a node to the end of the list 
     weapons.AddLast(object5); 

     PrintNodes(weapons); // This will show the DLL has 5 Nodes. 

    // Find the value of a node 
    } 
    public string FindTitle(LinkedList<Object> nameofDLL) 
    { 
     // initialise a Structures class 
     Structures structure = new Structures(); 

     // Find the value of a node 
     string value = structure.getTitle(weapons) + "\r\n"; 

     return value; 
    } 
    public void PrintNodes(LinkedList<object> values) 
    { 
     if (values.Count != 0) //check if there are any nodes in the list 
     { 
      txtOutput.Text += "The number of nodes is: " + values.Count.ToString() + "\r\n"; 

      txtOutput.Text += FindTitle(weapons); 

     } 

     else 
      txtOutput.Text += "The Doubly Linked List is empty" + "\r\n"; 
    } 
} 

}

+0

リスト内のオブジェクトの種類がわからないときは 'object'を使います。リストに武器だけが含まれているのなら、なぜこれはLinkedList ではないのですか? –

+0

フェアコール。私はそれをいくらか一般的に保つようにしていましたが、もしうまくいけばLinkedListをに変更して幸せでした! –

+0

に変更しても落ちていないので、ありがたいです。しかし、私はまだDLL内からタイトル値を返す方法を知る必要があります。私はどこが間違っているのか分かりません... –

答えて

0

あなたは間違った角度から問題にアプローチしているようです。 Doubly Linked Listの特定のインデックスで要素を取得しようとするのはお勧めできません。これは、その要素が設計されていないためです。 DLLを使用する目的は、リスト自体ではなく、リスト内の要素を使用してナビゲートできるコレクションを持つことです。たとえば、あるソースから特定のノードを取得した場合は、NextおよびPreviousプロパティを使用してリストをナビゲートできます。

リスト全体をトラバースするのが目的の場合は、一般的に2つの方法があります。第2の方法はwhileを使用している

​​

:まず、最も簡単なforeach方法です。この方法は少し複雑ですが、それはより明確に行動とのLinkedListの意向を示しています。

var node = linkedList.First; 
while (node != null) 
{ 
    Console.WriteLine(node.Value.Title); 
    node = node.Next; 
} 

もしあなたが絶対に特定のインデックスにある要素を取得する必要があり、それが可能であり、最も簡単な方法をElementAtまたはElementAtOrDefault LINQメソッドを使用することです。それらの違いは、指定されたインデックスがリストの境界外にある場合、ElementAtは例外をスローし、ElementAtOrDefaultは指定されたタイプのデフォルト値を返します(タイプの場合、デフォルト値はnull) - どの方法を選択する必要があり、あなたの特定の実装のために好むその動作に依存:

int idx = 5; 
var elem = linkedList.ElementAt(idx); 

しかし、私は私のコメントで言ったように、上記の方法は、基本的には通常のリストとしてのLinkedListを扱いますので、あなたがする必要がある場合これはしばしばあなたがなぜ単にリストを使用していないのかあなた自身に尋ねる必要があります。

+0

フィードバックのお寄せいただきありがとうございます。それは非常に助けになりました。 –

+0

@ChadLockwoodこれがあなたの質問に答えるなら、それを答えとしてマークしてください。 – Abion47

関連する問題