问题如下:(需要用c#编写ReserveComplemenet方法)
序列的反向互补是通过将其所有的碱基与它们的碱基互补交换,然后颠倒得到的序列而形成的。DNA序列的反向互补是通过交换以下所有实例来形成的:
F211
例如:
根据DNA序列AAGCT
,反向互补是AGCTT
。
此方法ReverseComplement()
必须接受以下参数:
此方法应返回void
,并将所引用的序列突变为其反向互补。
目前,这是我的代码,
string result = z.Replace('A', 'T').Replace('T', 'A').Replace('G', 'C').Replace('C', 'G');
string before = (result);
return before;
我被卡住了,不知道我该怎么做?任何帮助都将不胜感激。当我运行这个命令时,我得到的是AAGGA
而不是AGCTT
发布于 2019-04-07 18:09:12
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);
}
}
}
发布于 2019-04-07 17:34:24
与替换每个字符相比,使用linq更容易实现:
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解决方案(转换逻辑相同):
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();
}
发布于 2019-04-07 18:07:23
当我运行这个命令时,我得到的是AAGGA而不是AGCTT
因为您将其视为单个替换,而不是多个替换:
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
相反,我建议的是中介替换:
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
现在,如果您要执行此操作数百万次,则可能需要考虑使用StringBuilder。
https://stackoverflow.com/questions/55557177
复制相似问题