2016-06-23 38 views
-1

我創建了一個程序,用戶必須輸入一個序列,程序必須將每個三個字母與之前輸入的數據進行比較。總數據爲25個案例,這意味着程序必須比較Userseq的每個3個字符總共25個案例(每個3個字符的語句爲25個)。然後在完成第一個3個字符後,它移動到下一個3個字符,直到userseq完成。如果例子的前3個字符等於之前輸入的數據之一,則必須將其顯示在輸出中。我想要更少的代碼,並刪除我所有的if語句的另一種方式。我還有另外一個問題,那就是我要求程序做相同的事情,直到用戶羣的第三個字符的第十組爲止。如果用戶輸入少於10個3字符組(這意味着少於30個字符),程序會說「未處理的異常:System.ArgumentOutofrangeException:索引和長度必須引用字符串中的位置,這是我的代碼。 NB,那些代碼我通過只改變用戶eq編號(userseq1,userseq2 ..)寫了10次。是否有一種方法可以編寫程序來爲每個3字符的組重複相同的工作,直到userseq結束?是否有另一種更簡單的方法來編寫該程序?

Console.Write("Enter your sequecnce: "); 
     string Userseq = Console.ReadLine(); 
     string[] aa1 = { "TTT", "TTC" }; 
     string[] aa2 = { "TTA", "TTG" }; 
     string[] aa3 = { "CTT", "CTC", "CTA", "CTG" }; 
     string[] aa4 = { "ATT", "ATC", "ATA" }; 
     string[] aa5 = { "ATG" }; 
     string[] aa6 = { "GTT", "GTC", "GTA", "GTG" }; 
     string[] aa7 = { "TCT", "TCC", "TTCA", "TCG" }; 
     string[] aa8 = { "CCT", "CCC", "CCA", "CCG" }; 
     string[] aa9 = { "ACT", "ACC", "ACA", "ACG" }; 
     string[] aa10 = { "GCT", "GCC", "GCA", "GCG" }; 
     string[] aa11 = { "TAT", "TAC" }; 
     string[] aa12 = { "TAA", "TAG" }; 
     string[] aa13 = { "CAT", "CAC" }; 
     string[] aa14 = { "CAA", "CAG" }; 
     string[] aa15 = { "AAT", "AAC" }; 
     string[] aa16 = { "AAA", "AAG" }; 
     string[] aa17 = { "GAT", "GAC" }; 
     string[] aa18 = { "GAA", "GAG" }; 
     string[] aa19 = { "TGT", "TGC" }; 
     string[] aa20 = { "TGA" }; 
     string[] aa21 = { "TGG" }; 
     string[] aa22 = { "CGT", "CGC", "CGA", "CGG" }; 
     string[] aa23 = { "AGT", "AGC" }; 
     string[] aa24 = { "AGA", "AGG" }; 
     string[] aa25 = { "GGT", "GGC", "GGA", "GGG" }; 
     string Userseq1 = Userseq.Substring(0, 3); 
     if (aa1.Contains(Userseq1)) 
     { 
      Console.Write("Phe" + " "); 
     } 
     else if (aa2.Contains(Userseq1)) 
     { 
      Console.Write("Leu" + " "); 
     } 
     else if (aa3.Contains(Userseq1)) 
     { 
      Console.Write("Leu" + " "); 
     } 
     else if (aa4.Contains(Userseq1)) 
     { 
      Console.Write("Ile" + " "); 
     } 
     else if (aa5.Contains(Userseq1)) 
     { 
      Console.Write("Met" + " "); 
     } 
     else if (aa6.Contains(Userseq1)) 
     { 
      Console.Write("Val" + " "); 
     } 
     else if (aa7.Contains(Userseq1)) 
     { 
      Console.Write("Ser" + " "); 
     } 
     else if (aa8.Contains(Userseq1)) 
     { 
      Console.Write("Pro" + " "); 
     } 
     else if (aa9.Contains(Userseq1)) 
     { 
      Console.Write("Thr" + " "); 
     } 
     else if (aa10.Contains(Userseq1)) 
     { 
      Console.Write("Ala" + " "); 
     } 
     else if (aa11.Contains(Userseq1)) 
     { 
      Console.Write("Tyr" + " "); 
     } 
     else if (aa12.Contains(Userseq1)) 
     { 
      Console.Write("STOP" + " "); 
     } 
     else if (aa13.Contains(Userseq1)) 
     { 
      Console.Write("His" + " "); 
     } 
     else if (aa14.Contains(Userseq1)) 
     { 
      Console.Write("Gin" + " "); 
     } 
     else if (aa15.Contains(Userseq1)) 
     { 
      Console.Write("Asn" + " "); 
     } 
     else if (aa16.Contains(Userseq1)) 
     { 
      Console.Write("Lys" + " "); 
     } 
     else if (aa17.Contains(Userseq1)) 
     { 
      Console.Write("Asp" + " "); 
     } 
     else if (aa18.Contains(Userseq1)) 
     { 
      Console.Write("Glu" + " "); 
     } 
     else if (aa19.Contains(Userseq1)) 
     { 
      Console.Write("Cys" + " "); 
     } 
     else if (aa20.Contains(Userseq1)) 
     { 
      Console.Write("STOP" + " "); 
     } 
     else if (aa21.Contains(Userseq1)) 
     { 
      Console.Write("Trp" + " "); 
     } 
     else if (aa22.Contains(Userseq1)) 
     { 
      Console.Write("Arg" + " "); 
     } 
     else if (aa23.Contains(Userseq1)) 
     { 
      Console.Write("Ser" + " "); 
     } 
     else if (aa24.Contains(Userseq1)) 
     { 
      Console.Write("Arg" + " "); 
     } 
     else if (aa25.Contains(Userseq1)) 
     { 
      Console.Write("Gly" + " "); 
     } 
     else 
     { 
      Console.WriteLine(" \n You entered an invalid character. Other than A, T, C and G. Please check and retry."); 
     } 
+0

你*可以*創建鋸齒狀數組,即包含數組的數組。或者創建一個具有名稱和序列屬性的對象數組 –

+1

我想我會用字典來做。關鍵是序列的3位數字,以及您想要顯示的文本的值(「Phe」,「Leu」...) – Pikoh

+0

是的,它可以更緊湊。1)定義二維數組 - 而不是'aa1','aa2'使用一個數組。 2)在檢查值後添加控制檯輸出字符串,所有檢查都將進入簡單循環。比較'N-1'字符串,最後一個是'Console.Write'輸出。 – i486

回答

6

創建具有名稱和序列屬性的類,以保持每個序列,例如:

class EnzymeSequence 
{ 
    public string Name {get;set;} 
    public string[] Enzymes {get;set;} 

    public EnzymeSequence(string name,string[] enzymes) 
    { 
     Name=name; 
     Enzymes=enzymes; 
    } 
} 

和創建序列的瓦特的陣列或列表在這裏你添加所有你想要的序列:

var sequences=new EnzymeSequence[]{ 
        new EnzymeSequence("Phe",new[]{{ "TTT", "TTC" }), 
        ... 
       }; 

要找到一個序列,你可以這樣寫:

var match=sequences.FirstOrDefault(ez=>ez.Enzymes.Contains(Userseq1)); 

結果將包含用戶輸入的內容或空序列。

if (match==null) 
{ 
    Console.WriteLine(" \n You entered an invalid character. Other than A, T, C and G. Please check and retry."); 
} 
else 
{ 
    Console.Write("{0} ",match.Name); 
} 

如果你想找到具有某種酶的所有序列:

var matches=sequences.Where(ez=>ez.Enzymes.Contains(Userseq1)); 

如果你只是想匹配的名稱:

var names=sequences.Where(ez=>ez.Enzymes.Contains(Userseq1)) 
        .Select(ez=>ez.Name); 
var line=String.Join(" ",names); 
Concole.WriteLine(line); 

如果你有一個很多可以使用Parallel LINQ並行執行查找的序列:

var names=sequences.AsParallel() 
        .Where(ez=>ez.Enzymes.Contains(Userseq1)) 
        .Select(ez=>ez.Name); 

var line=String.Join(" ",names); 
Concole.WriteLine(line); 

如果所涉及序列的數量大約爲數千,那麼PLINQ將僅顯示改進。

另一種選擇是創建一個將酶與序列相匹配的「反向」字典。由於許多序列可包含相同的酶,我們需要按自己的酶序列 - 酶對創建由酶鍵控字典之前:

var enzymeSequences=(from seq in sequences 
         from enzyme in seq.Enzymes 
         let pair = new { seq.Name, enzyme } 
         group pair by enzyme into enzymeSeqs 
         select enzymeSeqs); 
var enzymeDict= enzymeSequences.ToDictionary(
         grp => grp.Key, 
         grp=> grp.Select(pair=>pair.Name) 
            .ToArray()); 

var matches = enzymeDict["AGG"]; 
Console.WriteLine(String.Join(" ", matches)); 
+0

比我的字典建議更好。 +1 – Pikoh

+0

謝謝你的回答。順便說一句,那些不是酶,它們是氨基酸。 –

+0

@WassimDernayka我不是生物學家,我嫁給了一個。我只是搜索了一個序列,並從* result *頁面中選取了看起來像名詞的第一個東西。我以前聽過這兩個詞,所以... –

0

我會採取使用字典的方法,具體如下:

public class TestClass 
{ 
    private Dictionary<string, List<string>> sequences; 

    public TestClass() 
    { 
     sequences = new Dictionary<string, List<string>>(); 
     sequences.Add("Phe", new List<string>() {"TTT", "TTC"}); 
     // Repeat for all the sequences. 
    } 

    public string GetSequenceType(string sequence) 
    { 
     foreach (var key in sequences.Keys) 
     { 
      if (sequences[key].Contains(sequence) 
       return key; 
     } 
     return null; 
    } 
} 
+0

由於您不搜索關鍵字,因此您無法使用詞典獲取任何內容。你確實要支付罰款,因爲每個條目都必須計算散列和桶。在這種情況下的關鍵是*序列*,而不是名稱。一個(多)字典將是有用的,雖然如果每個序列酶被添加爲關鍵字和序列名稱作爲價值 - 反向字典,如果你願意 –

相關問題