C#-使用EndofLoop

时间:2019-01-31 01:19:13

标签: c#

我正在使用C#在excel中比较不同工作表中的数据,并且还需要将通过/失败结果写入excel。 但是对于这部分代码,我只能在excel中得到“ fail”的结果,即使结果也应该是“ pass”。 有人可以看看吗?

for (i = 1; i <= baseline.GetLength(0); i++)
    for (j = 1; j <= baseline.GetLength(1); j++)
        {
          if (baseline[i, j]?.ToString() == result_PriceUpdate[i, j]?.ToString()) goto EndofLoop1; 
          if (baseline[i, j]?.ToString() != result_PriceUpdate[i, j]?.ToString()) goto EndofLoop2;
        }

   EndofLoop1:
   result_file.WriteResultToExcel("Result Summary", 2, 2, "pass");

   EndofLoop2:
   result_file.WriteResultToExcel("Result Summary", 2, 2, "fail");

2 个答案:

答案 0 :(得分:1)

问题中的代码永远不会比第一个单元格更多。

这两个if()条件之间的唯一区别是,一个条件使用==,而另一个条件使用!=。这些条件之一将永远是正确的。因此,第一个单元格将总是不断地跳出循环。就像您编写此代码一样,完全没有循环:

if (baseline[1, 1]?.ToString() == result_PriceUpdate[1, 1]?.ToString())
    goto EndofLoop1; 
if (baseline[1, 1]?.ToString() != result_PriceUpdate[1, 1]?.ToString()) 
    goto EndofLoop2;

EndofLoop1:
result_file.WriteResultToExcel("Result Summary", 2, 2, "pass");

EndofLoop2:
result_file.WriteResultToExcel("Result Summary", 2, 2, "fail");

也许您是依靠?.空条件运算符来创建与null的比较,这种想法与SQL中的行为相同,在SQL中,将值与{{1 }}可以同时为nullfalse条件产生!=That won't happen here.

更糟糕的是,跳转到== 并没有结束代码EndOfLoop1部分是该方法的一部分,它也将运行。第二部分运行后,它将替换第一部分中的工作。即使通过,您在文件中看到的结果仍然是“失败”。

更重要的是,如果某种原因在循环中没有任何条件为真,则在循环结束后,两个已命名部分仍将运行。

这里更好的实践就是不要使用EndOfLoop2没必要,而且显然很混乱。而是将字符串变量设置为“ pass”或“ fail”,并将gotoi更改为j,以便循环自然退出。然后只有一个int.MaxValue可以写出字符串变量。

循环中明显的错误意味着不幸的是,问题中的代码不够清晰,无法确定您的真正意图。我将根据您希望仅在 all 个单元格通过且如果 any 单元格失败而使整个数据集失效的想法来建议一种解决方案:

WriteResultToExcel()

我也有一个关于从1开始而不是从0开始的问题。C#数组从0开始,但是您永远不会尝试检查数组中任一维度的0位置,这似乎是一个明显的错误。

答案 1 :(得分:0)

最后,我解决了问题。循环不正确:

for (i = 1; i <= baseline.GetLength(0); i++)
    for (j = 1; j <= baseline.GetLength(1); j++)

应该是:

for (i = 1; i < baseline.GetLength(0); ++i)
    for (j = 1; j < baseline.GetLength(1); ++j)