2016-12-29 10 views
0

私は問題を熟読していますが、それを完全に解決する方法は不明です。 メソッドを追加し、キーが見つかるまで、または現在のノードがnullになるまで繰り返してから、参照をノードに返し、nullであるかどうかを割り当てます。私のコード(addメソッド内のコメントを参照してください):null参照型に割り当てる

public class MyClass<TKey, TValue> 
{ 
    private Node _baseNode; 

    public void Add(TKey key, TValue value) 
    { 
     var newNode = new Node(key, value); 

     //this returns null, as is expected. 
     var nodeToUpdate = TraverseDown(ref _baseNode, newNode.Key); 

     if (nodeToUpdate != null) 
      throw new ArgumentException("Cannot add a duplicate key."); 

     //here, I try to assign a value to _baseNode because I'd like 
     //nodeToUpdate to hold the reference to _baseNode 
     nodeToUpdate = newNode; 
    } 

    private Node TraverseDown(ref Node currentNode, int keyToFind) 
    { 
     if (currentNode == null || currentNode?.Key == keyToFind 
      || currentNode?.Edge == null) 
     { 
      //on first add, this is what is getting hit - as expected 
      return currentNode; 
     } 
     else 
     { 
      //these are being explicitly set to local variables because i was 
      //experimenting with passing them byRef, and that can't be done on 
      //properties 
      var leftNode = currentNode.Edge.LeftNode; 
      var rightNode = currentNode.Edge.RightNode; 
      return keyToFind < currentNode.Key 
          ? TraverseDown(ref leftNode, keyToFind) 
          : TraverseDown(ref rightNode, keyToFind); 
     } 
    } 
} 

TraverseDown方法が BYREFノードを受け入れることの全体のポイントは何でもノードへの参照を返すようにしようとすることですが、それであっても、発見されましたヌル。この場合、これは最初に追加されるアイテムなので、TraverseDownメソッドは_baseNodeへの参照を返す必要があります。nullはデフォルトです。しかし、これは単純にローカル変数をnewNodeに設定し、_baseNodeはnullのままです。

私はこれには簡単な答えがあると確信していますが、私は少し研究していて何も見つかりませんでした。してください、どんな助けも大歓迎です!

答えて

1

実際にref currentNodeを割り当てるTraverseDownメソッドには行がありません。代わりにその価値を返します。 refパラメータを渡すと、その値がメソッドの有効範囲全体の参照として扱われるということではありません。 パラメータ自体は、その値ではなく、参照として扱われます。だから、あなたが書いたときに...

return currentNode; 

はあなたがcurrentNode、ないの参照を返します。値はnullなので、(お客様のif (currentNode == null...ステートメントのため)は常に返されます。あなたは...

nodeToUpdate = newNode; 

を割り当てると

...あなたは、単にnull参照を割り当てます。

あなたが実際にTraverseDown_baseNodeに値を代入したいときは、メソッド内currentNodeを設定する必要があります。

currentNode = //Value 

注意あなたがあなたの方法でcurrentNodeを扱っているように動作in C# 7.0 there will be ref returns、その。

+0

このように迅速に対応していただき、ありがとうございます。これは完璧な意味合いがあります。ちょうどC#7.0のリンクを読んでください。そこに興味深いものがいくつかあります。 これは期待どおりに動作していると思いますが、コードの書き方を複雑にしています。代入ではなく、単に検索を実行するには 'TraverseDown'メソッドが必要です。これは、addメソッドのトップノードを明示的に設定しなければならないことを意味し、そのノードから直接親ノードを返します。直接操作したいノードではありません。あなたは他のアイデアを持っていない限り?再度、感謝します! – Switch386

+0

@ Switch386、参照として渡すことは、メソッドが代入を行わないようにしてもあまり意味がありません。これをやりなおうとしない場合は、新しい子を追加したいノード(つまり、新しい親ノード)を返すほうが意味があります。 – Sefe

関連する問題