为什么我的列表总数计算不正确?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)。我哪里错了?

为什么我的列表总数计算不正确?C#

使用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循环之前?