C# 如何将null转换为0

C# 如何将null转换为0,c#,.net,C#,.net,我建立了一个计算15个或更少数字的平均值的小程序。共有15个文本框,每个文本框的默认值为“0”。程序知道获取所有键入的数字的总和,并将其除以不返回“0”的文本框数。但是如果用户错误地删除了其中一个文本框中的一个“0”操作。。运行时错误 最初,我解决了这个问题,写了15次“if语句”(每个文本框一次): 此代码检查文本框中是否没有任何内容(例如,名为t1),如果为true,则程序将给出双精度“tr1”(不要与“t1”混淆),值为“0”,如果为false,则代码将给出双精度“tr1”的文本“t1”

我建立了一个计算15个或更少数字的平均值的小程序。共有15个文本框,每个文本框的默认值为“0”。程序知道获取所有键入的数字的总和,并将其除以不返回“0”的文本框数。但是如果用户错误地删除了其中一个文本框中的一个“0”操作。。运行时错误

最初,我解决了这个问题,写了15次“if语句”(每个文本框一次):

此代码检查文本框中是否没有任何内容(例如,名为t1),如果为true,则程序将给出双精度“tr1”(不要与“t1”混淆),值为“0”,如果为false,则代码将给出双精度“tr1”的文本“t1”

我不得不把这个“如果”写15遍。我想知道我是否可以用数组和for循环编写相同的代码,以及如何编写

下面是完整的代码(很抱歉,var名称与var的用法不同):

从文本框中检索值时放置.Trim()


tr3=Double.Parse(t3.Text.Trim())

当然,请创建一个
双tr[15]
和一个相应的文本字段数组

然后使用:

for (int i = 0; i < 15; i++) {
    if (t[i].Text == "") { 
        tr[i] = 0;
    } else {
        tr[i] = Double.Parse(t[i].Text);
    }
}
for(int i=0;i<15;i++){
如果(t[i].Text==“”){
tr[i]=0;
}否则{
tr[i]=Double.Parse(t[i].Text);
}
}

如果您的
If
语句占用了大量源代码,您可以选择以下内容:

tr1  = ( t1.Text == "") ? 0 : Double.Parse( t1.Text);
tr2  = ( t2.Text == "") ? 0 : Double.Parse( t2.Text);
:
tr15 = (t15.Text == "") ? 0 : Double.Parse(t15.Text);
tr1  = 0; try { tr1  = Double.Parse( t1.Text); } catch (Exception e) {};
tr2  = 0; try { tr2  = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr15 = 0; try { tr15 = Double.Parse(t15.Text); } catch (Exception e) {};
private static double ConvertTextboxValueToDouble(string value)
{
    double result;
    Double.TryParse(value, out result);

    return result;
}
这是好的和整洁的,不占用很多屏幕的房地产,它是相当容易看到的意图

或者,更好的办法是:

tr1  = ( t1.Text == "") ? 0 : Double.Parse( t1.Text);
tr2  = ( t2.Text == "") ? 0 : Double.Parse( t2.Text);
:
tr15 = (t15.Text == "") ? 0 : Double.Parse(t15.Text);
tr1  = 0; try { tr1  = Double.Parse( t1.Text); } catch (Exception e) {};
tr2  = 0; try { tr2  = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr15 = 0; try { tr15 = Double.Parse(t15.Text); } catch (Exception e) {};
private static double ConvertTextboxValueToDouble(string value)
{
    double result;
    Double.TryParse(value, out result);

    return result;
}
因为字段可能无效且非空

如果数据和控件的结构不同,则可以对数组和for循环执行相同的操作,但仅对15项可能不需要。当然,如果你要补充更多,我会认真考虑这个选择

您可能希望将值直接加载到数组中,这样就不需要
sch

double tr[15];
:
tr[ 0] = 0; try { tr[ 0] = Double.Parse( t1.Text); } catch (Exception e) {};
tr[ 1] = 0; try { tr[ 1] = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr[14] = 0; try { tr[14] = Double.Parse(t15.Text); } catch (Exception e) {};
:
double total = 0;
double sorf = 0;
for (int i = 0; i < 15; i++) {
    if (tr[i] > 0) {
        sorf = sorf + tr[i];
        total++;
    }
}
:
double tr[15];
:
tr[0]=0;try{tr[0]=Double.Parse(t1.Text);}catch(异常e){};
tr[1]=0;try{tr[1]=Double.Parse(t2.Text);}catch(异常e){};
:
tr[14]=0;try{tr[14]=Double.Parse(t15.Text);}catch(异常e){};
:
双倍合计=0;
双sorf=0;
对于(int i=0;i<15;i++){
如果(tr[i]>0){
sorf=sorf+tr[i];
总计++;
}
}
:
对于最小的代码解决方案,您还可以创建一个文本框数组,从中提取信息。类似于(未经测试):

textboxt[]={t1,t2,t3,…,t15};
双tr[t.长度];
:
对于(int i=0;i0){
sorf=sorf+tr[i];
总计++;
}
}
:
将tr1设置为文本框的数值,如果由于某种原因无法转换,则设置为0.0。如果转换成功,它也将返回true;如果转换失败,它将返回false,但是如果默认值为0.0,则不关心返回值

额外的好处:如果有人决定在文本框中输入“这不是一个数字”,它不会抛出异常。它只会看到值为0

要在数组中执行此操作

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 };
double tr[] = new double[t.Length];

for (int i = 0; i < t.Length; ++i)
{
    Double.TryParse(t[i].Text.Trim(), out tr[i]);
}
textboxt[]={t1、t2、t3、t4、t5、t6、t7、t8、t9、t10、t11、t12、t13、t14、t15};
双tr[]=新双[t.长度];
对于(int i=0;i
更新:

注意,期望能够计算包含0的数字的平均值是完全合理的。为此,请执行以下操作:

TextBox t[] = { t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15 };
double tr[] = new double[t.Length];
int valid_count = 0;

for (int i = 0; i < t.Length; ++i)
{
    if (Double.TryParse(t[i].Text.Trim(), out tr[i])) ++valid_count;
}
textboxt[]={t1、t2、t3、t4、t5、t6、t7、t8、t9、t10、t11、t12、t13、t14、t15};
双tr[]=新双[t.长度];
int有效计数=0;
对于(int i=0;i

将文本框的默认值设置为空白(“”),然后您就会知道有多少是用户合法输入的0,有多少是空白的。将总和除以有效计数,得到准确的平均值。(但请确保
有效\u count>0
,否则可能会出现被零除的异常。)

编写一个函数,将文本框值转换为双精度值,例如:

tr1  = ( t1.Text == "") ? 0 : Double.Parse( t1.Text);
tr2  = ( t2.Text == "") ? 0 : Double.Parse( t2.Text);
:
tr15 = (t15.Text == "") ? 0 : Double.Parse(t15.Text);
tr1  = 0; try { tr1  = Double.Parse( t1.Text); } catch (Exception e) {};
tr2  = 0; try { tr2  = Double.Parse( t2.Text); } catch (Exception e) {};
:
tr15 = 0; try { tr15 = Double.Parse(t15.Text); } catch (Exception e) {};
private static double ConvertTextboxValueToDouble(string value)
{
    double result;
    Double.TryParse(value, out result);

    return result;
}
然后从文本框中创建一个数组,将其值转换为双倍:

double[] values = 
    {
        ConvertTextboxValueToDouble(t1.text),
        ConvertTextboxValueToDouble(t2.text),
        ConvertTextboxValueToDouble(t3.text),
...
        ConvertTextboxValueToDouble(t15.text)
    }

您是否考虑过使用文本框而不是文本框

此外,与编写15次代码不同,您应该真正重构代码,并尝试以下方法之一:

  • 为所有输入框注册一个事件,其中所有输入框都使用相同的代码

    public void ValueChanged(Object sender, EventArgs e)
    {
        var numericUpDown = sender as NumericUpDown;
        if(numericUpDown  == null)
            return;
        //ToDo: Put some check code here
    }
    
  • 使用一些
    列表
    ,将所有框放入其中,并在其上迭代以检查所有设置

    var myList = new List<NumericUpDown>();
    //ToDo: Put all your boxes into it
    myList.Add(numericUpDown1);
    myList.Add(numericUpDown2);
    //or get the list from somewhere else
    myList.AddRange(this.Controls.OfType<NumericUpDown>())
    
    //OnButtonClick
    foreach(var numericUpDown in myList)
    {
        //ToDo: Do some checking
    }
    
    var myList=new List();
    //托多:把你所有的箱子都放进去
    myList.Add(numericUpDown1);
    myList.Add(numericUpDown2);
    //或者从其他地方获取列表
    myList.AddRange(this.Controls.OfType())
    //钮扣
    foreach(myList中的var numericUpDown)
    {
    //托多:做一些检查
    }
    

对于这种情况,为了在代码的一小部分中完成这项工作,我使用了一个肮脏的小技巧:将控件放入面板中

如果您的面板仅包含所需的控件(在本例中为文本框),则这将足以将值存储在双精度列表中:

    private void button1_Click(object sender, EventArgs e)
    {
        List<double> doubleList = new List<double>();

        foreach (TextBox t in panel1.Controls)
            doubleList.Add(this.checkTextBox(t));
    }

    private double checkTextBox(TextBox t)
    {
        return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0;
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
List doubleList=新列表();
foreach(面板1.控件中的文本框t)
doubleList.Add(this.checkTextBox(t));
}
专用双复选框(文本框t)
{
return(t.Text!=string.Empty)?Double.Parse(t.Text.Trim()):0;
}
如果您不能仅为文本框设置面板,并且设计强制您将控件混合到其中,则必须进行额外的检查/转换:

    private void button1_Click(object sender, EventArgs e)
    {
        List<double> doubleList = new List<double>();

        foreach (Control t in panel1.Controls)
            if(t is TextBox)
                doubleList.Add(this.checkTextBox((TextBox)t));
    }

    private double checkTextBox(TextBox t)
    {
        return (t.Text != string.Empty) ? Double.Parse(t.Text.Trim()) : 0;
    }
private void按钮1\u单击(对象发送者,Ev