2

所以标题可能有点误导,但请听我说。这并不像我在标题中所说的那么简单。

所以我有一个字符串说,

String dna="ACTG";

我必须将所述字符串转换为它的补码形式。为了补充所述字符串,我必须将所有出现的“A”替换为“T”,将“C”替换为“G”,将“T”替换为“A”,将“G”替换为“C”。所以 String 的补码应该是这样的:

String dnaComplement="TGAC";

我该如何正确地做到这一点?例如

String temp = dna.Replace("A", "T");
temp = temp.Replace("T", "A");
temp = temp.Replace("C", "G");
temp = temp.Replace("G", "C");

这将有输出:

TCTC

这是错误的。我是 C# 的初学者,我对使用它进行编程了解一点。我习惯使用java。

4

8 回答 8

4

就像是:

String dna="ACTG";
String dnaComplement = "";

foreach(char c in dna)
{
  if (c == 'A') dnaComplement += 'T';
  else if (c == 'C') dnaComplement += 'G';
 // and so long
}
于 2014-11-26T09:37:51.227 回答
2

您可以使用补语字典,然后使用 Linq Select

var complements = new Dictionary<char, char>
    {
        { 'A', 'T' },
        { 'C', 'G' },
        { 'G', 'C' },
        { 'T', 'A' },
    };

var original = "TGAC";
var transformated = string.Concat(original.Select(c => (complements.ContainsKey(c)) ? complements[c] : c));
于 2014-11-26T09:40:19.837 回答
1

我会这样做:

var complement = dna.Select(c =>
{
    switch (c)
    {
        case 'A': return 'T';
        case 'T': return 'A';
        case 'C': return 'G';
        case 'G': return 'C';
        default: throw new ArgumentException(); // or whatever
    }
});

编辑:有了这个,你得到一个IEnumerbale<char>. 要将其转换回字符串,请参见此答案

于 2014-11-26T09:49:50.823 回答
1

我会这样做:

var complements = new Dictionary<char, char>
{
    { 'A', 'T' },
    { 'C', 'G' },
    { 'G', 'C' },
    { 'T', 'A' },
};

string dna = "ACTG";

string dnaComplement =
    new string(
        dna
            .ToCharArray()
            .Select(x => complements[x])
            .ToArray());
于 2014-11-26T10:26:52.520 回答
0

首先将字符更改为其他内容。

String temp = dna.Replace("A", "t");
temp = temp.Replace("T", "A");
temp = temp.Replace("t", "T");
temp = temp.Replace("C", "g");
temp = temp.Replace("G", "C");
temp = temp.Replace("g", "G");

您的这段代码:

String temp = dna.Replace("A", "T"); // A's are changed to T...
temp = temp.Replace("T", "A"); // ... but your just obtained 'T's are changed back to A
// ...
于 2014-11-26T09:38:31.137 回答
0

就像 Michal Hosala 说的,你必须弄清楚补语的定义是什么。我假设您将字符串分成两等份,第一个字符串中的第一个字符是第二个字符串中第一个字符的补码。

当你有奇数个字符时,我也处理过这种情况,“ACXTG”的补码将是“TGXAC”。

string dna = "ACTG";
string dnaComplement = "";

if (dna.Length % 2 == 1)
    dnaComplement += dna[dna.Length / 2];
for (int i = 0; i < dna.Length / 2; i++)
    dnaComplement = dna[dna.Length - i - 1] + dnaComplement + dna[i];
于 2014-11-26T10:32:43.310 回答
0

上面的每个答案都是正确的,并且可以解决您的问题,但是如果您要经常进行大量替换,请考虑使用StringBuilderstring.Replace()每次调用它都会返回一个新的字符串实例,旧实例变成垃圾,必须被收集。这可能会导致您的应用程序性能下降。

于 2014-11-26T09:46:08.960 回答
0

替换为唯一标记,例如 A-->l、T-->m C-->n G-->o。现在您可以替换每个标记而不更改任何其他标记 - 所以 L-->T 等。

于 2014-11-26T09:34:57.117 回答