我正在尝试将我用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();
}
为什么要这样做,我该如何解决?
答案 0 :(得分:2)
尝试在循环中更改此行
protein = (aminoAcids[k]);
到
protein += (aminoAcids[k]);
C ++版本循环64次并附加到字符串,C#版本每次都重新初始化字符串,并以比较if (codon == codons[k])
找到的最后一个匹配结束。
密码子串发生同样的情况 这会在每个循环中重新初始化
codon=(RNA.Substring(beginIndex, endIndex - beginIndex));
但是,在这种情况下,我不确定构建单个字符串是否正确,然后检查字符串数组,如codons[k]
PS。虽然他们对生成的代码不太熟悉,但我发现你对使用parenthesys的自由使用有点分散注意力。您可以撰写aminoAcids[k];
和codon=RNA.Substring(beginIndex, endIndex - beginIndex);
。这(在我看来)更清楚。
答案 1 :(得分:1)
您的代码是LINQ的一个很好的候选者,它广泛用于C#。如果我正确地理解了逻辑,你可以写出类似的东西:
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())
);