如何推广硬编码循环

时间:2014-11-12 02:14:09

标签: c#

嗨,我很难概括这个硬编码循环。我有一个列表,其中包含肽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();
    }
}

1 个答案:

答案 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));