2015-03-24 58 views
0

我正在嘗試用戶輸入,E.G. ATCG並用TAGC替換字母。這些是DNA互補基礎。例如,如果用戶要輸入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/)」,其中的共識是「不,他們不應該」。 – 2015-03-24 22:20:46

+0

去字符和交換取決於所需的輸出heh – 2015-03-24 22:20:49

+0

因爲,如果我繼續做'outputBases2 = input1.Replace(「T」,「A」);'等,我只能返回其中之一 – DunderMifflin11 2015-03-24 22:22:03

回答

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

我會在你的Char數組中使用foreach和switch語句來替換每個字母。

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

'base'是C#中的一個關鍵字,所以我非常肯定,如果不將它改爲'@base '。這與string中的字符串相同,而不是'char's,就像另一個答案一樣。 – Sharparam 2015-03-25 00:54:45

0

一種方式做到這一點是通過使用switch語句

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

如果在case語句中將雙引號改爲單引號,這將返回'不能隱式地將類型字符串轉換爲char',如「A」 – DunderMifflin11 2015-03-24 22:28:56

+1

@ DunderMifflin11,這將修復錯誤「無法隱式轉換鍵入字符串以char「。例如'案例'A':' – 2015-03-24 22:31:24

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

請注意,如果您的原始字符串是Unicode的某些形式,這可能會做有趣的事情。你應該在其他答案中使用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 2015-03-24 22:43:12

+1

如果我用'ATTGCC'替換輸入,它會爲我返回TAACGG ..但請記住不要使用[ATCG]參數,它是正則表達式的模式。 – 2015-03-24 22:45:19

+0

這是答案(和我自己一樣)都比接受的答案好。 – 2015-03-25 12:26:43

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

您的打字速度比我快得多。:) – 2015-03-24 22:29:44

0

簡單的解決方案,但你可以做的更好:

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

這不起作用,它肯定會累積工作,每次都在變化。 – DunderMifflin11 2015-03-24 22:31:26

+1

嘗試一下,它的工作原理。 – 2015-03-24 22:33:12

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