首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >序列的反向补码

序列的反向补码
EN

Stack Overflow用户
提问于 2019-04-07 16:46:59
回答 5查看 1.2K关注 0票数 -3

问题如下:(需要用c#编写ReserveComplemenet方法)

序列的反向互补是通过将其所有的碱基与它们的碱基互补交换,然后颠倒得到的序列而形成的。DNA序列的反向互补是通过交换以下所有实例来形成的:

  • A with T
  • T with A
  • G with C
  • C with G
  • 然后颠倒结果序列。

F211

例如:

根据DNA序列AAGCT,反向互补是AGCTT

此方法ReverseComplement()必须接受以下参数:

  • Reference to a DNA sequence

此方法应返回void,并将所引用的序列突变为其反向互补。

目前,这是我的代码,

代码语言:javascript
复制
string result = z.Replace('A', 'T').Replace('T', 'A').Replace('G', 'C').Replace('C', 'G');


    string before = (result);
    return before;

我被卡住了,不知道我该怎么做?任何帮助都将不胜感激。当我运行这个命令时,我得到的是AAGGA而不是AGCTT

EN

回答 5

Stack Overflow用户

发布于 2019-04-07 18:09:12

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp8
{
    class Program
    {
        static void Main(string[] args)
        {
            var dict = new Dictionary<char, char>()
            {
                ['A'] = 'T',
                ['T'] = 'A',
                ['G'] = 'C',
                ['C'] = 'G',
            };

            var input = "AAGCT";
            var output = string.Concat(input.Select(c => dict[c]).Reverse()); // AGCTT

            Console.WriteLine(input);
            Console.WriteLine(output);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-04-07 17:34:24

与替换每个字符相比,使用linq更容易实现:

代码语言:javascript
复制
void Translate(ref string dna)
{
    var map = new string[] {"AGTC", "TCAG"};
    dna = string.Join("", dna.Select(c => map[1][map[0].IndexOf(c)]).Reverse());
}

从表示映射的字符串数组开始,然后为字符串的每个字符选择映射的字符,反转从Select获得的IEnumerable<char>,然后使用string.Join将其转换回字符串。

问题中的代码首先将A转换为T,然后将T转换为A,因此A返回的所有内容都是A,而T返回的所有内容也是A ( G和< code >D13也是如此)。

还有一个基于for循环和字符串构建器的非linq解决方案(转换逻辑相同):

代码语言:javascript
复制
void Translate(ref string dna)
{
    var map = new string[] {"AGTC", "TCAG"};
    var sb = new StringBuilder(dna.Length);
    for(int i = dna.Length-1; i > -1; i--)
    {
        sb.Append(map[1][map[0].IndexOf(dna[i])]);
    }
    dna = sb.ToString();
}
票数 1
EN

Stack Overflow用户

发布于 2019-04-07 18:07:23

当我运行这个命令时,我得到的是AAGGA而不是AGCTT

因为您将其视为单个替换,而不是多个替换:

代码语言:javascript
复制
z.Replace('A', 'T').Replace('T', 'A').Replace('G', 'C').Replace('C', 'G');

AAGCT
Replace('A', 'T')
TTGCT
Replace('T', 'A')
AAGCA
Replace('G', 'C')
AACCA
.Replace('C', 'G')
AAGGA

相反,我建议的是中介替换:

代码语言:javascript
复制
var z = "AAGCT";
var chars = z.Replace('A', '1')
  .Replace('T', 'A')
  .Replace('1', 'T')
  .Replace('G', '2')
  .Replace('C', 'G')
  .Replace('2', 'C')
  .Reverse()
  .ToArray();
var result = new string(chars);
Console.WriteLine(result);

收益率:

AGCTT

DotNetFIddle Example

现在,如果您要执行此操作数百万次,则可能需要考虑使用StringBuilder。

推荐阅读:The Sad Tragedy of Micro-Optimization Theater

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55557177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档