如何推广硬编码循环

本文关键字:循环 编码 何推广 | 更新日期: 2023-09-27 18:30:01

嗨,我很难概括这个硬编码的循环。我有一个列表,其中包含肽MW的密码子(字符串:AUG,CAG等)。M有密码子AUG,W有密码子UUG。

该代码的目的是按照MW:AGUUG的顺序组合密码子硬编码的循环使它正确。在这里,我知道给定肽中的氨基酸数量(2M和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();
    }
}

如何推广硬编码循环

目前,您想在这里做什么有点令人困惑,但我会尝试一下。

首先,你真的在滥用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));