Как заменить символы в строке в С#

Так что название может немного ввести в заблуждение, но выслушайте меня. Это не так просто, как я выразился в заголовке.

Итак, у меня есть строка, скажем,

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.


person Glynn Bacanto    schedule 26.11.2014    source источник
comment
Как вы определяете дополнения? т. е. есть ли у вас дополнения для букв, отличных от A, T, C, G?   -  person Michal Hosala    schedule 26.11.2014
comment
И потому что вы не можете запрограммировать простую работу для начинающих, которая теперь является продвинутой? МОЙ БОГ. Будьте реальны, пожалуйста. Вопрос правильный, но он совсем не продвинутый.   -  person TomTom    schedule 26.11.2014
comment
Михал, это пары оснований, которые образуют ДНК. Итак, в этом алфавите всего 4 буквы. Спаривание — это то, как ДНК может реплицироваться во время клеточного деления.   -  person Loofer    schedule 26.11.2014


Ответы (8)


Что-то типа:

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

foreach(char c in dna)
{
  if (c == 'A') dnaComplement += 'T';
  else if (c == 'C') dnaComplement += 'G';
 // and so long
}
person Leo Chapiro    schedule 26.11.2014
comment
+=копирует строку каждый раз, что может вызвать проблемы с эффективностью. - person Fabian H.; 26.11.2014

Вы можете использовать словарь дополнений, а затем использовать 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));
person Michal Hosala    schedule 26.11.2014

я бы сделал так:

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());
person Enigmativity    schedule 26.11.2014

Замените уникальными токенами, например, A-->l, T-->m C-->n G-->o. Теперь вы можете заменить каждый токен, не меняя другие, так что L-->T и т.д.

person Simon N    schedule 26.11.2014

Сначала измените символы на что-то другое.

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
// ...
person Sjips    schedule 26.11.2014

Каждый из приведенных выше ответов является правильным и решает вашу проблему, но если вы собираетесь часто выполнять много замен, рассмотрите возможность использования StringBuilder. string.Replace() возвращает новый экземпляр строки каждый раз, когда вы его вызываете, старый экземпляр становится мусором и должен быть собран. Это может привести к снижению производительности вашего приложения.

person user2936023    schedule 26.11.2014

я бы сделал так:

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
    }
});

EDIT: При этом вы получаете IEnumerbale<char>. Чтобы преобразовать это обратно в строку, см. этот ответ.

person Fabian H.    schedule 26.11.2014

Как сказал Михал Хосала, вы должны прояснить, что является определением дополнения. Я предполагаю, что вы разделили строку на 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];
person Trivinel    schedule 26.11.2014