2017-10-24 29 views
0

ケース:ループごとに異なる変数に値を格納する方法

18個のパラメータが必要なオブジェクトを作成しようとしていますが、これらのパラメータは各ループに対して取得したいものです。私はこれをどのようにして行うのですか?

18個のパラメータを期待していたクラスのコード:

public WaardeObjecten(string waardeNaam1, string waarde1, string waardeNaam2, string waarde2, string waardeNaam3, string waarde3, string waardeNaam4, string waarde4, string waardeNaam5, string waarde5, string waardeNaam6, string waarde6, string waardeNaam7, string waarde7, string waardeNaam8, string waarde8, string waardeNaam9, string waarde9) 
{ 
    this.waardeNaam1 = waardeNaam1; 
    this.waarde1 = waarde1; 

    this.waardeNaam2 = waardeNaam2; 
    this.waarde2 = waarde2; 

    this.waardeNaam3 = waardeNaam3; 
    this.waarde3 = waarde3; 

    this.waardeNaam4 = waardeNaam4; 
    this.waarde4 = waarde4; 

    this.waardeNaam5 = waardeNaam5; 
    this.waarde5 = waarde5; 

    this.waardeNaam6 = waardeNaam6; 
    this.waarde6 = waarde6; 

    this.waardeNaam7 = waardeNaam7; 
    this.waarde7 = waarde7; 

    this.waardeNaam8 = waardeNaam8; 
    this.waarde8 = waarde8; 

    this.waardeNaam9 = waardeNaam9; 
    this.waarde9 = waarde9; 
} 

コード私はこれまでのところ、オブジェクトを作成し、それを埋めるようになった:

それぞれについて、
foreach (Panel p in panels) 
{ 
    //ALWAYS 9 * (2 values) panels. 
    var selectedRadioButton = p.Controls.OfType<RadioButton>().FirstOrDefault(rb => rb.Checked); 
    if (selectedRadioButton != null) 
    { 
     totalStringForRadioButtons += $"{selectedRadioButton.Name} : {selectedRadioButton.Text} | "; 
    } 
} 

WaardeObjecten obj = new WaardeObjecten(**Expects 18 parameters here**); 

を各結果のために私がしたい(9)取得する:selectedRadioButton.NameおよびselectedRadioButton.Text(2)この18個の値をオブジェクトに入れます。

+7

:コールをimplify関数呼び出しにパラメータを指定する – musefan

答えて

0

より良い方法は、データを配列に格納し、それをWaardeObjectenコンストラクタに送信することです。このように:

public WaardeObjecten(string[] waardeNaam, string[] waarde) 
{ //do the assignment here} 

foreachループでは、あなたは文字列配列にデータを追加することができ、一方:指摘されたように

int i = 0; 
string waardenaam[9]; 
string waarde[9]; 
foreach (Panel p in panels) 
{ 
    var selectedRadioButton = p.Controls.OfType<RadioButton>().FirstOrDefault(rb => rb.Checked); 

    if (selectedRadioButton != null) 
    { 
      waardenaam[i] = selectedRadioButton.Name; 
      waarde[i] = selectedRadioButton.Text; 
    } 
    i++; 
} 

WaardeObjecten obj = new WaardeObjecten(waardenaam, waarde); 
+0

[i]:このコードでは、「管理配列を宣言するための不正な配列宣言子で、ランク指定子が変数の識別子に先行する」エラーを取得しています。 – Niels

+0

私はちょうどそれを行う方法としてあなたにアイデアを与えるためにここに大まかなコードを掲載しました。あなたのコードはC++ですか? – KulaDamian

+0

コードを確認して、文字列配列をループ外で初期化する必要があります。 – KulaDamian

1

、あなたのコードをリファクタリングする必要があります。これはあなたの問題を解決するだけでなく、将来的にはより柔軟なものにするでしょう。

public class WaardePaar 
{ 
    public string Naam { get; set; } 
    public string Waarde { get; set; } 
} 

public WaardeObjecten(IEnumerable<WaardePaar> paren) 
{ 
    // store in a private field list or array 
    _values = paren.ToList(); 
} 

これで、繰り返したりインデクサーを使って特定の値を取得できます。

public WaardePaar this[int index] 
{ 
    get { return _values[index]; } 
    set { _values[index] = value; } 
} 
+0

私はこのコードを手に入れませんコードは "WaardeObjecten"に置く必要がありますか?私のメインクラスにはどのようなコードがありますか? – Niels

+0

インデックスが一致する2つの配列を保持する代わりに、これらの2つの値を保持するオブジェクトを作成します(これは "WaardePaar"です)。メインクラスでは、インデクサー機能で簡単にアクセスできる配列またはリスト(ここでは_values)を保存するだけです。したがって、WaardeObjectenでインデクサーを実装すると、基本的にmyWaardeObjectenInstance [4]を呼び出してペア{Naam、Waarde}を取得することができます – Geoffrey

1

全体的にはデザインに問題があり、おそらくコードをリファクタリングする必要があるようです。しかし、それは答えに入るにはあまりにも多すぎるので、あなたの現在のコードに直接ソリューションを提供することに固執します。

文字列配列を使用して値を格納することをお勧めします。これをループに入れてから関数にパラメータを渡します。

宣言し、そのような文字列の配列を使用します。今

string[] values = new string[18]; 

int count = 0; 
foreach (Panel p in panels) 
{ 
    //ALWAYS 9 * (2 values) panels. 
    var selectedRadioButton = p.Controls.OfType<RadioButton>().FirstOrDefault(rb => rb.Checked); 
    if (selectedRadioButton != null) 
    { 
     values[count] = selectedRadioButton.Name; 
     values[count+1] = selectedRadioButton.Text; 
    } 

    count+=2; 
} 

を、あなたはこのようなあなたの関数を呼び出すことができます。また

WaardeObjecten obj = new WaardeObjecten(values[0], values[1], values[2] /*etc.*/); 

、あなたはこれにあなたの機能を変更することができます:

public WaardeObjecten(params string[] values) 
{ 
    this.waardeNaam1 = values[0]; 
    this.waarde1 = values[1]; 

    // etc. 
} 

次に理想的には大幅にあなたのコードをリファクタリングますが、コードのこの特定のインスタンスでは、私は、あなたが長さ18の文字列の配列を作成することをお勧めループ中に自分の価値観でそれを記入し、その後、それを使用

WaardeObjecten obj = new WaardeObjecten(values); 
+0

どこから[i]を取得できますか? – Niels

+0

@ニールズ:申し訳ありませんが、それは 'カウント'を意味していました。私は "ループ自動パイロットモード"にあった...固定 – musefan

+0

私は参照してください、私を試してみましょう。 – Niels

関連する問題