2015-03-24 3 views
0

Я пытаюсь взять пользовательский ввод, E.G. ATCG и заменить буквы TAGC. Это ДНК-дополнительные базы. Например, если пользователь должен был ввести ATCGGGC, он выдал бы TAGCCCG. Мне удалось заменить 1 символ, но я не уверен, как заставить остальных заменить.Заменить 4 разных символа

namespace DNA_Replication_EASY 
{ 
    class Program 
    { 

     static string input1; 


     public static string InputBaseWithSpaces() 
     { 
      return string.Join(" ", input1.ToCharArray()); 
     } 

     public static string OpposingBases() 
     { 
      string outputBases1 = input1.Replace("A", "T"); 
      return outputBases1; 
     } 

     static void Main(string[] args) 
     { 

      Console.WriteLine("Please type out your DNA strand bases E.g. A T C G C A T G"); 
      input1 = Console.ReadLine(); 
      Console.WriteLine(InputBaseWithSpaces()); 
      Console.WriteLine(OpposingBases()); 

      Console.ReadLine(); 
     } 
    } 
} 
+0

Я редактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Идущий символ по символу и свопинг в зависимости от желаемого выхода heh –

+0

Потому что, если бы я продолжал делать 'outputBases2 = input1.Replace (" T "," A ");' и т. Д., Я могу только вернуть один из них – DunderMifflin11

ответ

1

Преобразовать его в массив символов и заменить на месте

string input = "ATCG"; 
//TAGC 

char[] inputChar = input.ToCharArray(); 

for(int i=0;i< inputChar.Length; i++) 
{ 
    switch(inputChar[i]) 
    { 
     case 'A': 
      inputChar[i]='T'; 
      break; 
     case 'T': 
      inputChar[i]='A'; 
      break; 
     case 'G': 
      inputChar[i]='C'; 
      break; 
     case 'C': 
      inputChar[i]='G'; 
      break; 
    } 
} 
var output =new string(inputChar); 
1

Я бы использовал инструкцию foreach и switch для вашего Char Array для замены каждой буквы.

foreach (char base in strand) 
{ 
    switch (base.ToString()) 
    { 
     case "g": 
      //replace code 
      break; 
     case "c": 
      //replace code 
      break; 
    } 
} 
+0

'base' - это ключевое слово в C#, поэтому я уверен, что это не скомпилировалось бы, не меняя его на' @base '. Это также имеет ту же проблему, что и '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' – Sharparam

0

Один из способов сделать это с помощью переключателя заявление

public static string OpposingBases() 
    { 
     string outputBases1; 
     foreach(var s in input1) 
     {    
      switch (s) 
      { 
      case "A": 
       outputBases1 +="T"; 
       break; 
      case "T": 
       outputBases1 +="A"; 
       break; 
      case "C": 
       outputBases1 +="G"; 
       break; 
      case "G": 
       outputBases1 +="C"; 
       break; 
      case " ": 
       outputBases1 +=" "; 
       break; 
      default: 
       break; 
      } 
     } 
     return outputBases1; 
    } 
+0

Это возвращает 'не может неявно преобразовывать строку типа в char' в каждый из случаев, например« A » – DunderMifflin11

+1

@ DunderMifflin11, если двойные кавычки были изменены на одинарные кавычки в операторах case, это исправило бы ошибку« не может неявно конвертировать type string to char ". например 'case 'A':' –

1

Вы должны вместо этого написать процедуру, чтобы пройти через посимвольно и сделать замену (не использовать string.replace метод).

private string ConvertDNA(string original) 
{ 
     StringBuilder newone = new StringBuilder(); 
     foreach(char c in original) 
     { 
      switch(c) 
      { 
       case 'A': 
        newone.Append('T'); 
        break; 
       case 'T': 
        newone.Append('A'); 
        break; 
       case 'C': 
        newone.Append('G'); 
        break; 
       case 'G': 
        newone.Append('C'); 
        break; 
       default: 
        newone.Append(c); 
        break; 
      }  
     } 
     return newone.ToString(); 
} 

Обратите внимание, что если ваша исходная строка является определенными формами Юникода, это может сделать забавные вещи. В других ответах вы должны использовать stringbuilder, а не синтаксис + =, потому что он более эффективен.

5

Использование Regex.Replace заменить строку на основе словаря (карты):

Dictionary<string, string> complementary = new Dictionary<string,string>() 
{ 
    { "A", "T" }, 
    { "T", "A" }, 
    { "C", "G" }, 
    { "G", "C" } 

}; 
string input = "ATCG"; 
string result = Regex.Replace(input, "[ATCG]", match => complementary[match.Value]); 

это заменяет любой из символов матча «ATCG» с соответствующим значением из словаря.

+0

Извините, я думал, это сработало. Я не просто хотел, чтобы строка «ATCG» была заменена на «TAGC». Я хотел, чтобы он работал с любой строкой, буквы просто заменялись. Когда я ввел 'ATTGCC', он просто вернул« TAGC » – DunderMifflin11

+1

Если я заменил ввод на' ATTGCC', он вернет мне 'TAACGG' для меня. Но не забудьте оставить параметр' [ATCG] 'нетронутым, это шаблон для регулярного выражения. –

+0

Это ответ (как и мой собственный) лучше, чем принятый ответ. –

5
string MakeOpposite(string sourceString) { 
    var opposites = new Dictionary<char, char> { 
     { 'A', 'T' }, 
     { 'T', 'A' }, 
     { 'G', 'C' }, 
     { 'C', 'G' } 
    }; 
    var oppositeString = new string(sourceString.Select(x => opposites[x])); 
    return oppositeString; 
} 
+1

Ваша скорость печати намного быстрее меня.:) –

0

Простое решение, но вы можете сделать лучше:

code = code.Replace("A","x").Replace("C","y").Replace("T","A").Replace("G","C").Replace("x","T").Replace("y","G"); 
+0

Это не сработает, конечно, это будет работать кумулятивно, меняясь каждый раз. – DunderMifflin11

+1

Попробуйте, он работает. –

0

Вы могли бы сделать это

public static string OpposingBases() 
    { 
     var baseDictionary = new Dictionary<char, char>() 
     { 
      {'A', 'T'}, 
      {'T', 'A'}, 
      {'C', 'G'}, 
      {'G', 'C'} 
     }; 
     return input1.Where(baseDictionary.ContainsKey).Aggregate("", (current, c) => current + baseDictionary[c]); 
    } 
Смежные вопросы