私は問題を熟読していますが、それを完全に解決する方法は不明です。 メソッドを追加し、キーが見つかるまで、または現在のノードが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のままです。
私はこれには簡単な答えがあると確信していますが、私は少し研究していて何も見つかりませんでした。してください、どんな助けも大歓迎です!
このように迅速に対応していただき、ありがとうございます。これは完璧な意味合いがあります。ちょうどC#7.0のリンクを読んでください。そこに興味深いものがいくつかあります。 これは期待どおりに動作していると思いますが、コードの書き方を複雑にしています。代入ではなく、単に検索を実行するには 'TraverseDown'メソッドが必要です。これは、addメソッドのトップノードを明示的に設定しなければならないことを意味し、そのノードから直接親ノードを返します。直接操作したいノードではありません。あなたは他のアイデアを持っていない限り?再度、感謝します! – Switch386
@ Switch386、参照として渡すことは、メソッドが代入を行わないようにしてもあまり意味がありません。これをやりなおうとしない場合は、新しい子を追加したいノード(つまり、新しい親ノード)を返すほうが意味があります。 – Sefe