2012-02-23 15 views
2

リストボックスで種の選択肢を反映させるために、コード内に複数のスイッチを使用しています。私は何とかこれは明確な解決策は、スイッチのこの複数回使用ではないことを感じてC#複数のスイッチを避ける方法(デリゲート?)

private int getLengthOfChromosome(int number) { 

     int species = listBox1.SelectedIndex; 

     switch (species) { 
      case 0: 
       //Console.WriteLine("arabidopsis"); 
       return arabidopsis_chromosomes[number - 1]; 

      case 1: 
       //Console.WriteLine("oryza"); 
       return oryza_chromosomes[number - 1]; 

      case 2: 
       //Console.WriteLine("glycine"); 
       return glycine_chromosomes[number - 1]; 

      default: 
       Console.WriteLine("Error"); 
       throw new Exception("wrong speices choice"); 
     } 

:秒がどのように見える

private int getOrganelleLength() { 
     int species = listBox1.SelectedIndex; 

     switch (species) { 
      case 0: 
       //Console.WriteLine("arabidopsis"); 
       return 154478; 

      case 1: 
       //Console.WriteLine("oryza"); 
       return 134525; 

      case 2: 
       //Console.WriteLine("glycine"); 
       return 152218; 

      default: 
       Console.WriteLine("Error"); 
       throw new Exception("wrong speices choice"); 
     } 
    } 

:のようにそれらの一つが見えます。しかし、両方の関数は完全に異なる値を返す(もちろん、種の選択に基づいて)。方法があれば、私のコードを改善する方法を学ぶのが大好きです。どうもありがとう。

+1

各種別ごとに異なるクラスを使用します。 –

+0

ありがとう@devouredelysium、これは良いアイデアです。私は種に関するすべての情報を別々のクラスに入れます。しかし、私はまだ選択された種に基づいてデータを取得したいと思うでしょう。同じunknown_specieでコードを書いてから、それを実際のspecieで初期化することができればいいでしょう。 – Perlnika

答えて

1

arabidopsis_chromosomes他は配列またはリストです。

単に配列またはリストに追加してください。

例:(極端に単純化された):

object[][] foo = {{ 1,2,3}, {4,5,6}}; 

object Get(int x, int y) 
{ 
    return foo[x][y]; 
} 
+0

はい、これは間違いなくコードを短くします:)しかし、私はそれがもっと読みやすいかどうかは分かりません。 – Perlnika

1

あなたが書くことができます:あなただけの辞書値arabidopsis_chromosomesに追加できるようあなたは、実際のFuncを必要としない最後のケースでは

private int getOrganelleLength() { 
    var dict = new Dictionary<int, int>() { {0, 154478}, {1, 134525}, {2, 152218} }; 
    return dict[listBox1.SelectedIndex]; 
} 

private int getLengthOfChromosome(int number) { 
    var dict = new Dictionary<int, Func<int>>() { 
      {0,() => arabidopsis_chromosomes[number - 1]}, 
      {1,() => oryza_chromosomes[number - 1]} 
      {2,() => glycine_chromosomes[number - 1]}}; 
    return dict[listBox1.SelectedIndex](); 
} 

を、例えばその多くを書きました。

とにかく非常に簡単なスイッチがある場合にのみ動作します。 書き込みにもっと難しいものが必要な場合は、使用しないでください。その場合は、コードをリファクタリングして、多型やファクトリを使用する必要があります。

1

まずNotImplementedExceptiondefaultのケースに入れてExceptionではないようにしてください。

次に、Func<T, TResult> delegateをご覧ください。

あなたは、あなたの種ごとにISwitchCaseResolverインタフェースの具象クラスを実装することができ

private int GetInformationAboutSpecies(ListBox listBox, ISwitchCaseResolver helper) 
{ 
    return helper.GetInformation(listBox.SelectedIndex); 
} 

のようなあなたのコードを見に何かを持つことができます。 Factory patternを使用して、インターフェイスの正しい実装を呼び出すことも考えられます。