2014-11-26 1 views
2

제목이 약간 잘못 될 수는 있지만 나를 들어보세요. 제목에서 말한 것처럼 간단하지 않습니다.C에서 문자열의 문자를 바꾸는 방법 #

그래서 나는

String dna="ACTG"; 

내가 그것을 보완하는 형태의로 말했다 문자열을 변환 할 문자열 말할 수 있습니다. 이 문자열을 보완하기 위해 모든 "A"를 "T", "C"를 "G", "T"는 "A", "G"는 "C"로 바꿔야합니다. 문자열의 보완은 다음과 같아야합니다.

String dnaComplement="TGAC"; 

어떻게하면 제대로 할 수 있습니까? E.G. 잘못

TCTC 

:

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

출력을 할 것입니다. 저는 C# 초보자이며 프로그래밍에 대해 조금 알고 있습니다. 나는 자바를 사용하는 데 익숙하다.

+0

어떻게 보완합니까? 즉A, T, C, G 이외의 글자에 대한 보충 교재가 정의되어 있습니까? –

+1

그리고 간단한 초보자 작업을 프로그래밍 할 수 없기 때문에 지금은 "고급"입니까? OMG. 진짜로, 제발. 질문은 유효하지만 전혀 발전되지 않았습니다. – TomTom

+0

미칼은 DNA를 형성하는 염기쌍입니다. 그래서이 알파벳은 4 글자 밖에 없습니다. 쌍은 DNA가 세포 분열 과정에서 어떻게 복제 될 수 있는가를 나타냅니다. – Loofer

답변

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 
} 
+1

와우 ... 꼭해야만합니다. – kennyzx

+0

'+ ='는 매번 문자열을 복사하기 때문에 효율성 문제가 발생할 수 있습니다. –

0

예 : A -> 1, T -> m C -> n G -> o와 같이 고유 한 토큰으로 교체하십시오. 이제 다른를 변경하지 않고 각 토큰을 대체 할 수 있습니다 - 그래서 L을 -> T 등

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 
// ... 
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)); 
0

위의 답변의 각이 정확하고 문제를 해결, 자주 교체해야하는 경우 StringBuilder을 사용하는 것이 좋습니다. string.Replace()은 호출 할 때마다 새 문자열 인스턴스를 반환하고 이전 인스턴스는 가비지가되어 수집해야합니다. 이로 인해 앱의 성능이 저하 될 수 있습니다.

0

내가 이런 짓을 했을까 :

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>를 얻을. 이것을 다시 문자열로 변환하려면 this Answer을 참조하십시오.

0

내가 이런 짓을 했을까 : 마이클 Hosala 말했듯이, 당신이 보수의 정의 무엇인지 명확하게 할 필요가

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

. 문자열을 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];