2016-10-01 7 views
1

私の中に、同じオブジェクトを持つオブジェクトに問題があり、このオブジェクトはexamepleのために、その上の別のオブジェクトの内側にあり、:同じオブジェクト型の中で宣言されたオブジェクトのn番目の参照を取得するには?

class SomeObject 
{ 
    SomeObject obj; 
} 

var obj= new SomeObject{ }; 
obj.obj= new SomeObject{ }; 
obj.obj.obj= new SomeObject{ }; 

私の質問は、私は、最新のオブジェクトを見つけるのですか、私は使用することができていますこれは

if(obj.obj== null) 
{ 
    obj.obj= new SomeObject{ }; //assign it a new object 
} 

ですが、これを自動的に行う方法はありますか?それぞれのオブジェクトがIEnumerableインターフェイスを実装していない場合、すべてのオブジェクトをループする方法はありますか?どのように私は私が何をしなくても、それを新しいオブジェクトを割り当てることができるように初期化されていない最新のオブジェクトの参照を取得しますし、また:

obj.obj.obj.obj = new SomeObject{ }; 

答えて

2

再帰の概念があります:MSDNあなたがメソッドを宣言し、再帰呼び出しを行うことができますあなたが望むものが見つかるまで。

static void AddObject(SomeObject currentObject, SomeObject child) { 
    if(currentObject == null) return; 
    else if(currentObject.obj != null) AddObject(currentObject.obj, child); 
    else currentObject.obj = child; 
} 
+0

私はこれが最も簡単な解決策かもしれ思ったが、私が正しく理解していれば、私は、再帰との友好ないんだけど、それあなたが得るいくつかの調整が付きcurrentObeject.objがnullであるかどうかを調べています。そうでない場合、メソッドは再び呼び出されますが、currentObjectは現在チェックされていた前のobjになります。これは最終的に割り付けられたobjに到達するまで "増分"されます。ありがとうございました ! –

+1

後続の各呼び出しは、パラメータとして 'currentObject.obj'を取得します。これは直前のオブジェクトではなく、チェーン内の子であると直接呼びます。だからあなたの子供が別の子供を抱えているなら( '!= null')、私たちはちょうど下を扱い続けます。現在の子がチェーン内の最後の子であり、子をそれ以上保持しない場合( '== null')、新しい子を安全に追加することができます。 – 0xDECAFBAD

0

あなたが使用できるオブジェクトへのループに "ながら":

var obj = new SomeObject{ }; 
obj.obj = new SomeObject{ }; 
obj.obj.obj = new SomeObject{ }; 
var loopObj = obj; 
while (loopObj.obj != null){ 
    loopObj = loopObj.obj; 
} 

loopObjが最後objがあります。

1

あなたは他の方法でラウンドを行くので、長いobj.obj.objチェーン

// Create the last object first and then prepend others. 
SomeObject root = null; 
root = new SomeObject { obj = root }; 
root = new SomeObject { obj = root }; 
root = new SomeObject { obj = root }; 
root = new SomeObject { obj = root }; 

それともあなたが同様に最後のオブジェクトへの参照を保持し、オブジェクトの順序を逆にしたくない場合を排除することができる

SomeObject head = null; // References first object 
SomeObject tail = null; // References last object. 

// Add object 
var item = new SomeObject(); 
if (tail == null) { // head is null as well. 
    head = item; 
    tail = item; 
} else { 
    tail.obj = item; 
    tail = item; 
} 

結果は実際にリンクされたリストです。

public class Node<T> 
{ 
    public T Data { get; set; } 
    public Node<T> Next { get; set; } 
} 

public class LinkedList<T> 
{ 
    public Node<T> Head { get; set; } 
    public Node<T> Tail { get; set; } 

    public void Add(T data) 
    { 
     var node = new Node<T>{ Data = data }; 
     if (Tail == null) { // Head is null as well. 
      Head = node; 
      Tail = node; 
     } else { 
      Tail.Next = node; 
      Tail = node; 
     } 
    } 
} 
0

ベイ次の方法かもしれない:

var obj= new SomeObject{ }; 
      obj.obj= new SomeObject{ }; 
      obj.obj.obj= new SomeObject{ }; 

      var lastObject = obj; 
      int i = 0; 
      while (lastObject.obj != null) 
      { 
       i++; 
       lastObject = lastObject.obj; 
      } 
      Console.WriteLine ("i={0}; lastObject={1}", i, lastObject); 
関連する問題