2016-06-23 8 views
-1

私は、ユーザがシーケンスを入力しなければならないプログラムを作成しました。そして、プログラムは、プログラム内で以前に入力されたデータとそれぞれの3文字を比較しなければなりません。そして、合計データは25のケースであり、これは、プログラムがUserseqの各3文字と合計25ケース(各3文字ごとに25 if文)を比較しなければならないことを意味します。その後、最初の3文字を完了すると、それはuserseqが終了するまで次の3文字に移動します。 exempleの最初の3文字が前に入力したデータの1つと等しい場合は、それを出力に表示する必要があります。私は少ないコードで別の方法を望んで、私のすべてのif文を取り消します。そして、私は別の問題を抱えています。私は同じ事をするためにプログラムを尋ねました。同じ比較はuserseqの3文字の10番目のグループまでです。ユーザーが10文字未満の3文字(30文字未満を意味する)のグループを入力した場合、プログラムは「未処理例外:System.ArgumentOutofrangeException:文字列内の位置を参照する必要があります。 NBは、これらのコードはuserseq番号(userseq1、userseq2 ..)のみを変更して10回書いた。userseqの終わりまで3つの文字の各グループの同じ作業を繰り返すために、プログラムに書き込む方法はありますか?もう一つの簡単な方法でそのプログラムを書くことができますか?

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)2次元配列を定義する - aa1の代わりに、aa2は1つの配列を使います。 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)); 

結果は、ユーザーが入力またはnull何含むシーケンスとなります。

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 names=sequences.Where(ez=>ez.Enzymes.Contains(Userseq1)) 
        .Select(ez=>ez.Name); 
var line=String.Join(" ",names); 
Concole.WriteLine(line); 

:あなたが唯一の一致する名前にしたい場合

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

をパラレル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私は生物学者ではなく、私は結婚しています。私はちょうどシーケンスを検索し、*結果*ページから名詞のように見える最初のものを選んだ。私は前に両方の言葉を聞いたので... –

0

次のように私は、辞書を使用してのアプローチを取る:

+0

あなたはキーを検索しないので、辞書を使って何も得られません。あなたはハッシュとバケツが各エントリについて計算されなければならないので、ペナルティを支払う。この場合のキーは、*シーケンス*であり、名前ではありません。それぞれの配列の酵素がキーとして追加され、配列名が値として追加されていれば(マルチ)辞書が役立ちます。 –

関連する問題