2016-05-24 53 views
0

我需要删除字符串中的一个子字符串。我需要删除从特定字符开始的字符串,直到另一个字符。这是我的代码:为什么递归不起作用?

[Test] 
    public static void TestDeleteSign() 
    { 
     var s = "РасчНал[]{@ТипНП}/РасчНалГруп[]{@СубРФ}/@ДоляНалБаз"; 
     var result = DeleteSignature(s); 
     var acceptResult = "РасчНал/РасчНалГруп/@ДоляНалБаз"; 
     Assert.AreEqual(acceptResult, result); 
    } 
    public static string DeleteSignature(string s) 
    { 
     if (s.Contains("[]{")) 
     { 
      var firstEntry = s.IndexOf("[]{"); 
      var closeEntry = s.IndexOf('}'); 
      s = s.Remove(firstEntry, closeEntry - firstEntry + 1); 
      DeleteSignature(s); 
     } 
     return s; 
    } 

结果是:

Expected: "РасчНал/РасчНалГруп/@ДоляНалБаз" 
But was: "РасчНал/РасчНалГруп[]{@СубРФ}/@ДоляНалБаз" 
+0

而当您运行该代码时会发生什么?当你研究这个问题时你发现了什么? – Sayse

+0

预计: “РасчНал/РасчНалГруп/ @ДоляНалБаз” 不过是: “РасчНал/РасчНалГруп[] {@СубРФ}/@ДоляНалБаз” –

+12

提示:DeleteSignature(S)的'的声明;'是不会做任何有用,因为你没有使用返回值... –

回答

4

你的函数返回一个字符串。在你的函数的第一次迭代之后,你的函数被第二次调用。无论发生什么情况,您的代码只会返回一个段落,因为您对DeleteSignature(s)的递归执行无效。您需要返回递归执行的输出,如:

public static string DeleteSignature(string s) 
{ 
    if (s.Contains("[]{")) 
    { 
     var firstEntry = s.IndexOf("[]{"); 
     var closeEntry = s.IndexOf('}'); 
     s = s.Remove(firstEntry, closeEntry - firstEntry + 1); 
     return DeleteSignature(s); 
    } 
    return s; 
} 
+0

我认为OP所犯的错误是认为重新分配s的引用会影响其他地方的对象,但是在DeleteSignature的每个实例中s的引用变量与对同一对象的其他引用无关。 –