我应该将值输入到文本框中,然后显示输入值的总和,值的平均值以及输入的值的数量。
到目前为止,我已编码:
List<int> intScoreList = new List<int>(20);
decimal decScoreAverage = 0m;
decimal decScoreTotal = 0m;
private void btnAdd_Click(object sender, EventArgs e)
{
int intScore = Convert.ToInt32(txtScore.Text);
int intScoreCount = 0;
intScoreList.Add(intScore);
for (int i = 0; i < intScoreList.Count; i++)
{
intScoreList[0] = intScore;
decScoreTotal += intScoreList[i];
intScoreCount++; //correct
decScoreAverage = decScoreTotal / intScoreCount; //correct
}
当我输入30和40的测试值时,总数给出110(30 + 40 * 2)而不是70(30 + 40)。我哪里错了?
答案 0 :(得分:4)
使用Linq
。在添加按钮单击事件上,只需添加已解析的值。然后显示平均值和计数。
List<decimal> scoreList = new List<decimal>();
private void btnAdd_Click(object sender, EventArgs e)
{
decimalnum;
if (decimal.TryParse(txtScore.Text, out num))
{
scoreList.Add(num);
}
// Assign to count label Text property = scoreList.Count;
// Assign to average label Text property = scoreList.Average();
}
现在想象一下重置所有用户输入的能力:
private void btnReset_Click(object sender, EventArgs e)
{
scoreList.Clear();
}
利用列表实例,您可以轻松添加输入的数字并从用户正确解析。 Average Linq
扩展方法会为您完成所有数学运算,无需自行完成。
答案 1 :(得分:1)
评论者&#39; (有理由)点下面,这里有更多解释。
您的总体计算不正确主要是因为您要更改记录值的第一项:intScoreList[0] = intScore;
。通过改变它,你就是在干扰总和。
一个非常干净的操作包括将新数据添加到数组并重新计算总和。
List<int> intScoreList = new List<int>(20);
decimal decScoreAverage = 0m;
decimal decScoreTotal = 0m;
private void btnAdd_Click(object sender, EventArgs e)
{
int intScore = Convert.ToInt32(txtScore.Text);
int intScoreCount = 0;
intScoreList.Add(intScore);
decScoreTotal = 0;
foreach(int i in intScoreList) {
decScoreTotal += i;
}
decScoreAverage = decScoreTotal / intScoreList.Count;
intScoreCount = inScoreList.Count;
}
请注意,这不一定是最有效的实现,因为随着值的数量增加,foreach
循环将变得越来越昂贵。更好的方法是跟踪当前总数和平均值,并使用新值进行调整(如果需要,您仍可以将其添加到列表中以用于其他目的)。
平均值以这种方式计算:
New_average = old_average * (count-1)/count + new_value /count
这是新代码:
List<int> intScoreList = new List<int>(20);
decimal decScoreAverage = 0m;
decimal decScoreTotal = 0m;
private void btnAdd_Click(object sender, EventArgs e)
{
int intScore = Convert.ToInt32(txtScore.Text);
int intScoreCount = 0;
intScoreList.Add(intScore);
intScoreCount = inScoreList.Count;
decScoreTotal += intScore;
decScoreAverage = decScoreAverage * (intScoreCount- 1)/intScoreCount + intScore/intScoreCount;
}
答案 2 :(得分:0)
由于循环累加了所有项目, 不&#39;你想要
decScoreTotal = 0
在你的for循环之前?