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

时间:2015-11-12 18:41:50

标签: c#

我应该将值输入到文本框中,然后显示输入值的总和,值的平均值以及输入的值的数量。

到目前为止,我已编码:

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)。我哪里错了?

3 个答案:

答案 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循环之前