我正在使用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");
答案 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 }}可以同时为null
和false
条件产生!=
。 That won't happen here.
更糟糕的是,跳转到==
并没有结束代码。 EndOfLoop1
部分是该方法的一部分,它也将运行。第二部分运行后,它将替换第一部分中的工作。即使通过,您在文件中看到的结果仍然是“失败”。
更重要的是,如果某种原因在循环中没有任何条件为真,则在循环结束后,两个已命名部分仍将运行。
这里更好的实践就是不要使用EndOfLoop2
。没必要,而且显然很混乱。而是将字符串变量设置为“ pass”或“ fail”,并将goto
和i
更改为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)