1

C++ で作成したプログラムを C# Windows フォーム プログラムに再作成しようとしています。プログラムが正常に動作しない原因は、1 つだけあります。

私のプログラムは、ユーザーが DNA または RNA 文字の文字列/シーケンスを入力できるようにする生物情報学プログラムであり、プログラムはそれを対応するタンパク質/アミノ酸に変換し、プログラムが認識するすべてのコドンのアミノ酸/タンパク質を出力します。「AAA GGG CCC」と入力すると、「Lysine Glycine Proline」と出力されます。

これは、C++ バージョンで問題が発生しているコードのスニペットです。

for (i=0; i<numberOfCodons;i++)
{
    endIndex=beginIndex+3;
    codon="";
    {
        //here is where I'm having the trouble converting this to C# and have it cout the write
        //way                  
        codon.append(RNA.substr(beginIndex,endIndex-beginIndex));
    }
    for (k=0;k<64;k++)
    {
        if(codon==codons[k])
        {
             //here is where I'm having the trouble converting this to C# and have it cout the write way
             //like I metioned previously AAA GGG CCC couts Lysine Glycine Proline 
             protein.append(aminoAcids[k]);                
        }            
    }
    beginIndex+=3;
}
cout<<protein<<endl;
protein.clear();

ここに私がこれまでにC#で持っているものがあります

private void Tranlate_Click(object sender, EventArgs e)
{
    numberOfCodons = rnaLength / 3;
    beginIndex = 0;
    richTextBox2.AppendText("Total Number Of codons are: ");
    richTextBox2.AppendText(numberOfCodons.ToString());
    richTextBox2.AppendText("\n");
    for (i = 0; i < numberOfCodons; i++)
    {
        endIndex = beginIndex + 3;
        codon = "";                
        {
            // these are the two possible conversions of the C++ code that dont work at all for me******
            // codon.AppendText(RNA.Substring(beginIndex, endIndex - beginIndex));
            codon=(RNA.Substring(beginIndex, endIndex - beginIndex));
        }
        for (k = 0; k < 64; k++)
        {
            if (codon == codons[k])
            {
                //supposed to print out all the coresponding amino acids from the array and it will only print out one amino acid (Lysine)*******
                //protein.AppendText(aminoAcids[k]);
                protein = (aminoAcids[k]);
            }
        }
        beginIndex += 3;
    }
    richTextBox2.AppendText(protein);
    richTextBox2.AppendText("\n");
    //protein.clear();
}

なぜこれを行うのですか?どうすれば修正できますか?

4

2 に答える 2

2

ループ内でこの行を変更してみてください

protein = (aminoAcids[k]); 

protein += (aminoAcids[k]); 

C++ バージョンは 64 回ループして文字列に追加します。C# バージョンは毎回文字列を再初期化し、比較によって見つかった最後の一致で終了し if (codon == codons[k])ます。

コドン文字列でも同じことが起こります
これにより、ループごとに再初期化されます

codon=(RNA.Substring(beginIndex, endIndex - beginIndex));  

ただし、この場合、単一の文字列を作成してから、次のような文字列配列に対してチェックすることが正しいかどうかはわかりませんcodons[k]

PS。それらは生成されたコードに影響を与えませんが、あなたの括弧の自由な使用は少し気を散らすものだと思います. aminoAcids[k];と と書くことができますcodon=RNA.Substring(beginIndex, endIndex - beginIndex);。これは(私の意見では)より明確です。

于 2012-10-13T12:30:49.217 に答える
1

あなたのコードは、C# で広く使用されている LINQ の良い候補です。ロジックを正しく理解していれば、次のように書くことができます。

richTextBox2.AppendText(string.Join("\n",
                                      Enumerable.Range(0, numberOfCodons)
                                        .Select(i => RNA.Substring(i * 3, i * 3 + 3))
                                        .Where(c => codons.Contains(c))
                                        .Select(c => aminoAcids[codons.IndexOf(c)])
                                        .ToArray())
                                    );
于 2012-10-13T13:02:19.470 に答える