1

我正在尝试将我用 C++ 制作的程序重新创建为 C# windows 窗体程序,我已经完成了大部分工作。有一件小事使程序无法正常工作。

我的程序是一个生物信息学程序,它允许用户输入 DNA 或 RNA 字符的字符串/序列,程序将其转换为相应的蛋白质/氨基酸,并为程序看到的每个密码子打印出一个氨基酸/蛋白质。因此,如果我输入“AAA GGG CCC”,它会打印出“赖氨酸甘氨酸脯氨酸”。

这是我在 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 回答