【问题标题】:For loop - sum all number - closed [closed]For循环-对所有数字求和-关闭[关闭]
【发布时间】:2017-06-30 01:39:00
【问题描述】:

我想添加以前的号码和当前号码。这里有示例但有错误。

for (int i = 0; i < e.MasterRecord.DetailCount; i++)    
{    
    sumIdosage += Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i).UDF["Dosage"]);

    // i want to sum all the dosage    
}

TxtBox5.Text = sumIdosage.ToString();

if (Convert.ToDecimal(TxtBox5.Text) < 100)    
{    
    MessageBox.Show("Your Dosage is less than 100%");    
}

但最后答案与图片 dropbox.com/s/zav68w79hwa20ss/11.JPG?dl=0

不同

【问题讨论】:

  • 错误是什么?
  • 总和与公式不同,因为我分享的图片 dropbox.com/s/zav68w79hwa20ss/11.JPG?dl=0
  • 代码本身看起来不错。但是你为什么要测试TxtBox5 值呢? sumIdosage,恕我直言。此外,调试器是你的朋友。在发生加法的那一行放置一个调试点,并查看变量状态如何变化。也戴上手表,观察变量的变化、详细记录的值等。考虑到这一点,这是解决这个问题的最佳(也是最快)方法。
  • @code4life 因为用量是%,所以需要按公式计算100%。如果低于 100% 需要警告用户。
  • 在开始这段代码之前你是否设置了sumIdosage = 0;

标签: c# for-loop sum


【解决方案1】:

您只是将最后一个值分配给sumIdosage,而不是在任何地方添加任何内容。您需要在循环之前将sumIdosage初始化为0,然后执行sumIdosage += ...

另外,将小数转换为字符串并再次转换回小数是没有意义的:

TxtBox5.Text = sumIdosage.ToString();
if (Convert.ToDecimal(TxtBox5.Text) < 100)

而只是这样做:

if (sumIdosage < 100)

【讨论】:

  • 如果我使用 += 数字将在 sum1+(i1)+(i2)+(i3)=sum2 之后从 (i1)+(i2)=sum1 跳跃等等..跨度>
  • x += yx = x + y 的缩写
  • 是的,我知道这个逻辑,我正在使用第三方软件来编辑程序。我不知道为什么会变成这样。那些逻辑已经正确,可以让用户键入,主要问题是 += 逻辑..有什么想法吗?
  • 我不明白你的问题。您上面(i1)+(i2)=sum1 after that sum1+(i1)+(i2)+(i3)=sum2 的示例不正确。 sum2 不等于 sum1+(i1)+(i2)+(i3)。它只等于(i1)+(i2)+(i3),或sum1+(i3)
  • 您真的要求仅将前一个数字和当前数字相加吗?你的问题问一件事。您的代码注释提出了完全不同的问题。 Ian 已经解释了如何获得所有数字的总和,但如果您需要不同,那么您需要澄清。
【解决方案2】:

您可以创建一个列表来放置当前和下一个的所有总和,如下所示:

List<Decimal> sumOfCurrPrev = new List<Decimal>();
for (int i = 0; i < e.MasterRecord.DetailCount-1; i++)    
{    
    sumOfCurrPrev.Add( Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i).UDF["Dosage"])+Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i+1).UDF["Dosage"]));
}

列表中都是总和。例如,sumOfCurrPrev[0] 中是Convert.ToDecimal(e.MasterRecord.GetDetailRecord(0).UDF["Dosage"])+Convert.ToDecimal(e.MasterRecord.GetDetailRecord(1).UDF["Dosage"]) 的总和,sumOfCurrPrev[1] 中是Convert.ToDecimal(e.MasterRecord.GetDetailRecord(1).UDF["Dosage"])+Convert.ToDecimal(e.MasterRecord.GetDetailRecord(2).UDF["Dosage"]) 的总和等等

如果你想要当前和以前的,你可以这样做:

List<Decimal> sumOfCurrPrev = new List<Decimal>();
    for (int i = 1; i < e.MasterRecord.DetailCount; i++)    
    {    
        sumOfCurrPrev.Add( Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i-1).UDF["Dosage"])+Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i).UDF["Dosage"]));
    }

【讨论】:

  • 你会得到一个IndexOutOfRangeException,使用i &lt; e.MasterRecord.DetailCount - 1
  • 谢谢 ;) 我已经更新了我的答案。
【解决方案3】:
sumIdosage += Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i).UDF["Dosage"]);------

【讨论】:

  • 如果我使用 += 数字将在 sum1+(i1)+(i2)+(i3)=sum2 之后从 (i1)+(i2)=sum1 跳跃等等..跨度>
  • @ChengWan 不正确,它会执行 (i1)+(i2)+(i3)+(i4)... 例如,如果值为 [3, 2, 4, 8],则第一次运行将是 @ 987654323@,第二个是3 + 2,第三个是5 + 4,第四个是9 + 8,你的最终结果将是正确的值17
  • 这与问题中存在的代码完全相同......而且完全缺乏解释使其完全无用的答案。
  • @AlexeiLevenkov 在我在这里发布答案后,原始问题已被修改。这就是为什么你看到这是相同的代码。请在发表您的意见之前检查日期和时间。
【解决方案4】:

您的+= 逻辑是正确的。假设e.MasterRecord.DetailCount 是它看起来的样子,而e.MasterRecord.GetDetailRecord(i).UDF["Dosage"] 做了它看起来做的事情,似乎真的只有两个选项。

要么:

  1. 上面的假设是错误的
  2. 在您开始求和之前,sumIdosage 已经包含某种值。

应该工作

decimal sumIdosage = 0;
for (int i = 0; i < e.MasterRecord.DetailCount; i++)    
{    
    sumIdosage += Convert.ToDecimal(e.MasterRecord.GetDetailRecord(i).UDF["Dosage"]);
}

TxtBox5.Text = sumIdosage.ToString();
if (sumIdosage < 100)    
{    
    MessageBox.Show("Your Dosage is less than 100%");    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2017-02-02
    • 2013-07-19
    • 2023-04-09
    • 1970-01-01
    • 2015-01-15
    • 2013-03-09
    相关资源
    最近更新 更多