C# C-无法使用EndofLoop获得正确的结果

C# C-无法使用EndofLoop获得正确的结果,c#,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()

我使用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");

问题中的代码不可能看到超过第一个单元格的内容

两个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条件运算符创建与null的比较,其思想与SQL中的行为相同,其中将值与null进行比较可能会为这两个值都产生false!=and==条件

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

更重要的是,如果循环中没有任何条件是真的,那么在循环完成后,两个命名的部分仍然会运行

这里更好的做法就是不要使用goto。这是没有必要的,而且它很明显把事情搞混了。相反,将字符串变量设置为pass或fail,并将i和j更改为int.MaxValue,以便循环立即自然退出。然后只有一个WriteResultToExcel来写出字符串变量

循环的明显错误意味着问题中的代码不够清晰,无法确定您的真正意图。我将根据您只希望在所有单元通过时通过的想法提出解决方案,如果任何单元失败,将使整个数据集失败:

string result = "pass";
for (i = 0; i < baseline.GetLength(0); i++)
    for (j = 0; j < baseline.GetLength(1); j++)
        {
           if (baseline[i, j]?.ToString() != result_PriceUpdate[i, j]?.ToString()) 
           {
               result = "fail";
               i = int.MaxValue;
               j = int.MaxValue;
           }
        }
result_file.WriteResultToExcel("Result Summary", 2, 2, result);

我还有一个关于从1开始而不是从0开始的问题。C数组从0开始,但您从未尝试检查数组的任何维度的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)

您总是在第一次比较后退出循环。您根本没有检查所有的值。看起来您用来写入电子表格失败的行总是最后一行,并覆盖该单元格上的任何内容。查看发生了什么的最简单方法是在第一个if语句上设置断点,然后检查基线[1,1]和结果[1,1]的值。在即时窗口中,您可以执行基线[1,1]!=结果\u PriceUpdate[1,1],并查看它是否返回true或false。其中一个端部可能有额外的空间,或者外壳可能不同。您还可以将代码更改为if baseline[i,j]?.ToString.Trim.Equalsresult_PriceUpdate[i,j]?.ToString.Trim,StringComparison.OrdinalIgnoreCase??错误的当您转到EndofLoop1时,您写入pass,但继续执行,超过EndofLoop2标签,写入失败。另一个问题是,您的第一个标签落入第二个标签。现在,在第二个标签之后需要第三个标签,在第一个标签之后需要一个goto,因此如果结果为pass,则跳过第二个标签。请注意,不需要循环,因为您只比较了第一个项目。不清楚您希望代码做什么。如果在第一次比较后有一个goto,为什么要使用循环?谢谢@joelcoehoorn,但是我得到一个错误索引超出了数组的界限。对于this@Emily您可能希望从0开始,在循环变量为@Emily时运行,然后基线大于结果\u PriceUpdate more rows?。这可能是一个非常好的时间来确保这是真的。对于两个数组的两个维度,GetLength的结果是否相同?@JoelCoehoorn错误来自i=int.MaxValue;