【问题标题】:What is the point of using do-while loop in this code snippet?在此代码段中使用 do-while 循环有什么意义?
【发布时间】:2014-05-18 04:28:53
【问题描述】:

我刚刚发现Roslyn源代码,我看到一个代码sn-p看起来像这样:

var text = stringBuilder.ToString();
int length;
do
{
    length = text.Length;
    text = text.Replace("{\r\n\r\n", "{\r\n");
} while (text.Length != length);

在我看来奇怪,因为 String.Replace 方法一次性用新值替换所有出现的指定字符串。所以这个循环是第一次执行,然后执行更改第二次再次执行并且什么都不做。然后它就结束了.. 那么使用loop 而不是只写有什么意义:

var text =  stringBuilder.ToString();
text = text.Replace("{\r\n\r\n", "{\r\n");

甚至更短:

var text = stringBuilder.ToString().Replace("{\r\n\r\n", "{\r\n");

我错过了什么吗?

【问题讨论】:

  • 是的 - 你错过了字符串在括号“{”之后可能包含两个以上的换行符 - 然后它会继续删除额外的换行符,直到只剩下一个。
  • 我不太喜欢那个代码,因为它很难理解。当然,它可能会快一点,但为什么不使用 String.Contains("{\r\n")?我不知道这个 sn-p 到底在哪里使用以及输入多长时间,但通常这不会显着降低程序速度。
  • @user2241553:你想用String.Contains("{\r\n")实现什么?
  • 我认为这并不难理解,一条评论就会非常清楚。另外,对于大多数字符串库(以及 C# 中的字符串),String.Length 为 O(1),String.Contains 为 O(n)。当然,您可以使用正则表达式一次性完成整个替换,但是...

标签: c# loops while-loop do-while


【解决方案1】:

假设字符串在左大括号后有三个空行:

"{\r\n\r\n\r\n\r\n"

第一次迭代会产生这样的结果:

"{\r\n\r\n\r\n"

第二个会产生这个:

"{\r\n\r\n"

第三个会产生:

"{\r\n"

每次迭代都会删除一个空行。

【讨论】:

  • 我的回答更具表现力。
  • 这确实有道理。我不敢相信我会想念那个:) 我会尽快接受。
【解决方案2】:

是的 - 你错过了字符串在括号“{”之后可能包含两个以上的换行符 - 然后它将继续删除额外的换行符,直到只剩下一个。

【讨论】:

    【解决方案3】:

    它使用(某种)递归来处理一组替换,这些替换暴露了随后需要以相同方式替换的新字符集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2016-09-13
      • 1970-01-01
      • 2011-03-06
      • 2022-12-12
      • 2021-07-18
      • 2015-12-20
      相关资源
      最近更新 更多