次のコードサンプルに多くの変数があり、その「型」が明確でない場合は事前にお詫びします。これは大きなライブラリです。ここにすべてを入れることはできません。 -レベル、そして変数の名前もちょっと役に立ちます...
問題: 「概念」は多くの「関係」を持つことができます。これらの関係のそれぞれにも多くの概念があります。たとえば、父と子のように、父親には多くの子供がいて、子供はそれ自体が父親であり、さらに多くの子供がいる可能性があります。すべての階層をファイルに書き込みます...
私が使用している高レベルのコードはこれです。問題は、子をもう持たない子を取得すると、Null 例外によってクラッシュすることです。したがって、そのオブジェクトは次の行で null です。
oUCMRConceptReltn = moTargetConceptList.ConceptReltns.get_ItemByIndex(i, false);
だから私はそれを周りにnullでないチェックを入れようと思いました.ええ、クラッシュを修正しますが、最初のリーフを見た後、それ以上進まず、アルゴリズムが停止します. だから私が再帰を呼んでいる方法に何か問題がありますが、それを理解することはできません.
private void MyLoadMethod(string sConceptCKI)
{
UCMRConceptLib.UCMRConceptLoadQual oUCMRConceptLoadQual = new UCMRConceptLib.UCMRConceptLoadQual();
//Fill out UCMRConceptLoadQual object to get new list of related concepts
moTargetConceptList.Load(oUCMRConceptLoadQual;
// WHEN IT IS ZERO, THERE ARE NO MORE CHILDREN.
int numberofKids = moTargetConceptList.ConceptReltns.Count();
if (numberofKids == 0)
return ;
for (int i = 1; i <= numberofKids; i++)
{
oUCMRConceptReltn = moTargetConceptList.ConceptReltns.get_ItemByIndex(i, false);
//Get the concept linked to the relation concept
if (oUCMRConceptReltn.SourceCKI == sConceptCKI)
{
oConcept = moTargetConceptList.ItemByKeyConceptCKI(oUCMRConceptReltn.TargetCKI, false);
}
else
{
oConcept = moTargetConceptList.ItemByKeyConceptCKI(oUCMRConceptReltn.SourceCKI, false);
}
//write its name to the file...now recursion: go and find its children.
builder.AppendLine("\t" + oConcept.PrimaryCTerm.SourceString);
MyLoadMethod(oConcept.ConceptCKI);
}
return ;
}