如何在不同变量中存储每个循环值

时间:2017-10-24 08:56:11

标签: c# winforms class foreach

案例:

我正在尝试创建一个需要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个值放在对象中。

3 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分: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.
}

然后只是简化通话:

WaardeObjecten obj = new WaardeObjecten(values);

答案 2 :(得分: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);