如何在 c# 中替换字符串中的字符
本文关键字:字符串 字符 替换 | 更新日期: 2023-09-27 18:32:14
所以标题可能有点误导,但请听我说。这并不像我在标题中所说的那么简单。
所以我有一个字符串说,
String dna="ACTG";
我必须将所述字符串转换为它的补码形式。为了补充上述字符串,我必须将所有出现的"A"替换为"T","C"替换为"G","T"替换为"A",将"G"替换为"C"。所以字符串的补码应该看起来像这样:
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。
像这样:
String dna="ACTG";
String dnaComplement = "";
foreach(char c in dna)
{
if (c == 'A') dnaComplement += 'T';
else if (c == 'C') dnaComplement += 'G';
// and so long
}
您可以使用补语字典,然后使用 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));
先将字符更改为其他字符。
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
// ...
我会这样做:
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>
.要将其转换回字符串,请参阅此答案。
我会这样做:
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());
替换为唯一标记,例如 A-->l、T-->m C-->n G-->o。 现在您可以替换每个令牌而不更改任何其他令牌 - 因此 L-->T 等。
上面的每个答案都是正确的,可以解决你的问题,但是如果你要经常做很多替换,请考虑使用StringBuilder。 字符串。Replace() 每次调用它时都会返回一个新的字符串实例,旧实例会变成垃圾,必须收集。这可能会导致应用的性能下降。
就像Michal Hosala说的,你必须弄清楚补语的定义是什么。我假设您将字符串分成 2 个相等的部分,第一个字符串中的第一个字符是第二个字符串中第一个字符的补码。
我也处理了当你有奇数个字符的情况,"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];