C# 有人能推荐一个简洁的解决这个问题的方法吗?

C# 有人能推荐一个简洁的解决这个问题的方法吗?,c#,C#,我如何避免这样的代码 dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJan.Text, 0); dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtMar.Text, 0); dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtApr.Text, 0); dblCalcTotal = dblCalcTotal + Utils.GetDecimal(

我如何避免这样的代码

dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJan.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtMar.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtApr.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtFeb.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtMay.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJun.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtJul.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtAug.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtSep.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtOct.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtNov.Text, 0);
dblCalcTotal = dblCalcTotal + Utils.GetDecimal(txtDec.Text, 0);
这个怎么样

double dblCalcTotal = Sum(txtJan.Text, txtFeb.Text, txtMar.Text .....);

private static double Sum(params string[] list)
{
    double result = 0;
    foreach (string s in list)
    {
        result += Utils.GetDecimal(s, 0);
    }
    return result;
}

首先,将文本框添加到列表中:

List<TextBox> months = new List<TextBox>();
months.add(txtJan);
months.add(txtFeb);
... 

将文本框放入
列表中

然后可以使用LINQ:

calcTotal += monthBoxes.Sum(t => Utils.GetDecimal(t.Text, 0));

一个简单的循环就可以做到这一点:

var items = new[] {txtJan, txtFeb, txtMar...};
dblCalcTotal = 0;
foreach(var item in items) {
    dblCalcTotal += Utils.GetDecimal(item.Text, 0);
}

假设他们处于某种家长控制之下

for(var control in ParentControl.Controls){
  dblCalcTotal += Utils.GetDecimal(control.Text, 0);
}

你能把月份框做成一个控制数组吗

如果是这样,代码将缩短为:

for (int i = 0; i < txtMonths.Length; i++)
    dblCalcTotal += Utils.GetDecimal(txtMonth[i].Text, 0);
for(int i=0;i
每当您有这么多控件时,您应该开始考虑一个更好的控件,一个显示多个值的控件。DataGridView是这里的最佳选择,因为它允许编辑。这也提供了一个很好的机会来自动使您的UI以任何语言工作。在窗体上放置DGV,使构造函数如下所示:

Public Sub New()
    InitializeComponent()
    Dim col = DataGridView1.Columns.Add("sales", "Sales")
    DataGridView1.Columns(col).ValueType = GetType(Decimal)
    DataGridView1.AllowUserToAddRows = False
    DataGridView1.AllowUserToDeleteRows = False
    DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders

    With System.Globalization.CultureInfo.CurrentUICulture
        DataGridView1.Rows.Add(.Calendar.GetMonthsInYear(DateTime.Now.Year))
        For Each row As DataGridViewRow In DataGridView1.Rows
            row.HeaderCell.Value = .DateTimeFormat.MonthNames(row.Index)
            row.Cells(col).Value = 0
        Next
    End With
End Sub
现在计算总数变得很简单:

Private Sub ButtonTotalSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTotalSales.Click
    Dim sales As Decimal = 0
    For Each row As DataGridViewRow In DataGridView1.Rows
        sales += CDec(row.Cells("sales").Value)
    Next
    '' etc..
End Sub

这是winforms还是webforms?不要使用匈牙利符号。@SLaks不要使用无用的匈牙利符号,请参阅:假设父控件中没有其他控件,这是不可能的。真的吗?你从不把你的控件分组?如果我有一组“月”控件,我会把它们放在一个容器中……MonthBoxwes可能也会有一个LINQ查询?(不确定controlcollection是否支持该功能)@Stefan:您可以编写
someParent.Controls.OfType()。其中(c=>?)
Private Sub ButtonTotalSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTotalSales.Click
    Dim sales As Decimal = 0
    For Each row As DataGridViewRow In DataGridView1.Rows
        sales += CDec(row.Cells("sales").Value)
    Next
    '' etc..
End Sub