比较包含C#格式的字符串

时间:2010-06-01 16:19:56

标签: c# string equality

我正在研究一个给出一些设置的函数 - 比如行间距,输出(以字符串形式)被修改。为了测试这样的场景,我正在使用字符串文字,如下所示的预期结果。

该方法使用字符串构建器(AppendLine)生成所述输出。我遇到的一个问题是比较这些字符串。在下面的示例中,两者在它们所代表的内容方面是相同的。结果是我关心的区域,但是当比较两个字符串时,一个字面值,一个字母,不平等自然会失败。这是因为其中一个字符串发出行间距,而另一个字符串只显示它包含的格式。

解决这个平等问题的最佳方法是什么?我非常关心格式化,例如方法结果中的新行,这一点至关重要。

代码:

string expected = @"Test\n\n\nEnd Test.";
string result = "Test\n\n\nEnd Test";

Console.WriteLine(expected);
Console.WriteLine(result);

输出:

  Test\n\n\nEnd Test.
  Test


  End Test

4 个答案:

答案 0 :(得分:4)

@前缀告诉编译器完全按照写入的方式获取字符串。因此,它不会将\n字符格式化为回车符和换行符。

由于分配给 result 变量的字符串没有相同的前缀,因此编译器会对其进行格式化。如果您想继续使用@前缀,请执行以下操作:

    string expected = @"Test


End Test";

您必须在字符串中输入回车符和换行符作为不可见字符。

答案 1 :(得分:3)

您错误地使用了“文字”一词​​。 “Literal”仅表示代码中存在的实际值。换句话说,代码中的值存在为变量(为了简单起见,我在此组中包含常量)和文字。变量是值的抽象概念,而文字是值

这就是说你的两个字符串都是字符串文字,因为它们是硬编码到你的应用程序中的。 @前缀只是声明编译器要在字符串中包含转义字符(实际上是双引号以外的任何字符),而不是在将字符串文字编译到程序集时评估转义序列。

首先,无论函数返回什么(包含换行符的标准转义序列而不是换行符本身的字符串,或实际包含换行符的字符串)都是您的测试变量应包含的。使您的测试尽可能接近实际输出,因为您将更多的工作量按到可比较的形式,您需要测试的代码路径越多。如果您希望能够将字符串与嵌入其中的格式转义序列进行比较,并将字符串评估为这些序列(实际上是比较示例中的两个字符串),那么我会这样说:

  1. 请确保您真的想要这样做。
  2. 在解释这些值并将“格式字符串”转换为“格式化字符串”时,您必须复制C#编译器的功能。
  3. 对于做#2,RegEx处理器可能是最简单的选择。有关C#字符串转义序列的列表,请参阅this page

答案 2 :(得分:0)

我觉得有些开悟,但对我发现的东西感到恼火。

这是我使用MSTest的第一个项目,在测试失败后,我选择了查看测试详细信息来查看测试失败的原因和原因。此详细信息显示中字符串输出的格式很差,例如:

Assert.AreEqual failed. Expected:<TestTest End>. Actual:<TestTest End>.

这是针对格式化文本的 - 奇怪的是如果你有/r(换行符)而不是换行符(/n),格式化实际上是正确的。

结果是在 debug 模式下查看运行测试所需的正确输出。换句话说,如果测试失败,请在调试中运行测试,异常将被捕获并显示如下:

Assert.AreEqual failed. Expected:<Test


Test End>. Actual:<Test


 Test End>.

以上显然包含正确的格式。

最后我发现我在字符串中存储期望(格式化)的初始方法是正确的,但我对MSTest的不熟悉使我质疑我的意思,因为它似乎是有效的输入,但只是显示回到我自己看似有效的输出。

答案 3 :(得分:-1)

在进行比较之前使用正则表达式去除空格?