2016-05-24 108 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的引用變量與對同一對象的其他引用無關。 –