为什么我的列表总数计算不正确?C#
本文关键字:不正确 计算 我的 列表 为什么 | 更新日期: 2023-09-27 18:21:39
我应该将输入的值输入到文本框中,然后显示输入值的总数、值的平均值以及已输入值的计数。
到目前为止,我已经编码:
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)。我哪里错了?
使用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
扩展方法将为您完成所有的数学运算,无需自己完成。
对于下面评论者的观点,这里有更多的解释。
您的合计计算不正确,主要是因为您正在更改记录值的第一项: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;
}
由于循环将所有项目相加,你不想要吗
decScoreTotal = 0
在你的for循环之前?