我建立了一个小程序来计算15个或更少的平均数。有15个文本框,每个文本框的默认值为“0”。程序知道获取所有类型数字的总和,并将其除以不返回“0”的文本框的数量。但是如果用户错误地删除了其中一个文本框中的'0'之一..运行时错误。
最初我通过写“ if statement ”15次(每个文本框一个)来解决这个问题:
if (t1.Text == "") { tr1 = 0; }
else
{
tr1 = Double.Parse(t1.Text);
}
此代码检查文本框中是否有东西(例如,名为t1),如果为true,则程序给出 double 'tr1'(不要与'混淆' t1'),值为'0',如果为false,则代码为 double 'tr1'提供't1'的文本。
我必须写'如果'15次。我想知道我是否可以用数组和for循环编写相同的代码,以及如何编写?
这里是整个代码(抱歉var名称与var的使用不相似。):
private void goyouidiot_Click(object sender, EventArgs e)
{
double tr1;
double tr2;
double tr3;
double tr4;
double tr5;
double tr6;
double tr7;
double tr8;
double tr9;
double tr10;
double tr11;
double tr12;
double tr13;
double tr14;
double tr15;
if (t1.Text == "") { tr1 = 0; }
else
{
tr1 = Double.Parse(t1.Text);
}
if (t2.Text == "") { tr2 = 0; }
else
{
tr2 = Double.Parse(t2.Text);
}
if (t3.Text == "") { tr3 = 0; }
else
{
tr3 = Double.Parse(t3.Text);
}
if (t4.Text == "") { tr4 = 0; }
else
{
tr4 = Double.Parse(t4.Text);
}
if (t5.Text == "") { tr5 = 0; }
else
{
tr5 = Double.Parse(t5.Text);
}
if (t6.Text == "") { tr6 = 0; }
else
{
tr6 = Double.Parse(t6.Text);
}
if (t7.Text == "") { tr7 = 0; }
else
{
tr7 = Double.Parse(t7.Text);
}
if (t8.Text == "") { tr8 = 0; }
else
{
tr8 = Double.Parse(t8.Text);
}
if (t9.Text == "") { tr9 = 0; }
else
{
tr9 = Double.Parse(t9.Text);
}
if (t10.Text == "") { tr10 = 0; }
else
{
tr10 = Double.Parse(t10.Text);
}
if (t11.Text == "") { tr11 = 0; }
else
{
tr11 = Double.Parse(t11.Text);
}
if (t12.Text == "") { tr12 = 0; }
else
{
tr12 = Double.Parse(t12.Text);
}
if (t13.Text == "") { tr13 = 0; }
else
{
tr13 = Double.Parse(t13.Text);
}
if (t14.Text == "") { tr14 = 0; }
else
{
tr14 = Double.Parse(t14.Text);
}
if (t15.Text == "") { tr15 = 0; }
else
{
tr15 = Double.Parse(t15.Text);
}
double[] sch = { tr1, tr2, tr3, tr4, tr5, tr6, tr7, tr8, tr9, tr10, tr11, tr12, tr13, tr14, tr15 };
double total = 0;
double sorf = 0;
for (int i = 0; i != 14; i++)
{
sorf = sorf + sch[i];
if (sch[i] > 0)
{ total++; }
}
double totalic = sorf / total;
string glass = totalic.ToString();
result.Text = ("your score: " + glass);
}
答案 0 :(得分:10)
Double.TryParse(t1.Text.Trim(), out tr1);
将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]);
}
更新:
注意,期望能够计算包含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;
}
将TextBoxes的默认值设置为空白(“”),然后您将知道用户输入的合法数量为0,以及有多少空白。将总和除以valid_count
以获得准确的平均值。 (但请确保valid_count > 0
,否则您可能会获得除零例外。)
答案 1 :(得分:7)
当然,制作一个double tr[15]
和相应的文本字段数组。
然后使用:
for (int i = 0; i < 15; i++) {
if (t[i].Text == "") {
tr[i] = 0;
} else {
tr[i] = Double.Parse(t[i].Text);
}
}
答案 2 :(得分:3)
如果只是使用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) {};
因为字段可能无效和非空白。
如果您对数据和控件的结构不同,可以对数组和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++;
}
}
:
对于 minimal 代码解决方案,您还可以创建一个从中提取信息的文本框数组。像(未经测试)的东西:
TextBox t[] = {t1, t2, t3, ..., t15};
double tr[t.length];
:
for (int i = 0; i < t.length; i++) {
tr[i] = 0; try { tr[i] = Double.Parse(t[i].Text); } catch (Exception e) {};
}
:
double total = 0;
double sorf = 0;
for (int i = 0; i < tr.length; i++) {
if (tr[i] > 0) {
sorf = sorf + tr[i];
total++;
}
}
:
答案 3 :(得分:2)
编写一个将文本框值转换为double的函数,如:
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)
}
答案 4 :(得分:1)
您是否考虑使用NumericUpDown而不是TextBox?
此外,您应该重新编写代码并尝试以下方法之一,而不是写一些东西十五次:
为所有输入框注册一个事件,其中所有事件都使用相同的代码
public void ValueChanged(Object sender, EventArgs e)
{
var numericUpDown = sender as NumericUpDown;
if(numericUpDown == null)
return;
//ToDo: Put some check code here
}
使用一些List<T>
放置所有框,并迭代它以检查所有设置
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
}
答案 5 :(得分:0)
从TextBox
中检索值时放置.Trim()tr3 = Double.Parse(t3.Text.Trim());
答案 6 :(得分:0)
对于这种情况并考虑在一小部分代码中完成工作,我使用一个肮脏的小技巧:将控件放入面板。
如果您的面板仅包含所需的控件(在本例中为文本框),则这足以将值存储在双打列表中:
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 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;
}
问候!