嗨,我很难概括这个硬编码循环。我有一个列表,其中包含肽MW的密码子(字符串:AUG,CAG等)。 M有密码子AUG,W有密码子UUG。
代码的目的是按照MW:AUGUUG的顺序组合密码子 硬编码循环正确。在这里我知道给定肽中的氨基酸数量(2 M和W)我想推广任何长度的肽MWMRS ..... 特别是我有
aminoAcidCodons:{ Mcodons[AUG],Wcodons[UGG]}
for (int h = 0; h < aminoAcidCodons[0].Multiplicity; h++)
{
stbld = new StringBuilder();
stbld.Append(aminoAcidCodons[0].Codons[h]);
codonsList0.Add(stbld.ToString());
stbld.Clear();
for (int j = 0; j < aminoAcidCodons[1].Multiplicity; j++)
{
stbld.Append(codonsList0[h]);
codon = aminoAcidCodons[1].Codons[j];
stbld.Append(codon);
codonsList1.Add(stbld.ToString());
stbld.Clear();
}
}
我尝试了这个通用循环
for (int h = 0; h < aminoAcidCodons.Count ; h++)
{
stbld = new StringBuilder();
stbld.Append(aminoAcidCodons[h].Codons[0]);
codonsList1.Add(stbld.ToString());
stbld.Clear();
for (int j = 0; j < aminoAcidCodons[h].Multiplicity; j++)
{
// stbld = new StringBuilder();
// stbld.Append(aminoAcidCodons[h].Codons[0]);
// codonsList0.Add(stbld.ToString());
stbld.Append(codonsList1[h]);
codon = aminoAcidCodons[h].Codons[j];
stbld.Append(codon);
codonsList1.Add(stbld.ToString());
stbld.Clear();
}
}
答案 0 :(得分:0)
目前你在这里尝试做的事情有点令人困惑,但我会对此进行一次抨击。
首先,你真的在滥用StringBuilder
。在这种情况下你的代码没有必要,你只是把事情变得比必要的复杂。
这是您的第一个没有StringBuilder
的代码示例:
for (int h = 0; h < aminoAcidCodons[0].Multiplicity; h++)
{
codonsList0.Add(aminoAcidCodons[0].Codons[h]);
for (int j = 0; j < aminoAcidCodons[1].Multiplicity; j++)
{
codonsList1.Add(
aminoAcidCodons[0].Codons[h]
+ aminoAcidCodons[1].Codons[j]);
}
}
更简单!
现在为通用版本:
private IEnumerable<string> CombineCodons(
AminoAcidCodon[] aminoAcidCodons,
int index)
{
for (int h = 0; h < aminoAcidCodons[index].Multiplicity; h++)
{
yield return aminoAcidCodons[index].Codons[h];
if (index + 1 < aminoAcidCodons.Length)
{
foreach (var child in CombineCodons(aminoAcidCodons, index + 1))
{
yield return aminoAcidCodons[index].Codons[h] + child;
}
}
}
}
就像我说的那样,我不确定你要做什么,但我认为这很接近。
这样称呼:
codonsList1.AddRange(CombineCodons(aminoAcidCodons, 0));