C# 为什么递归不起作用?

C# 为什么递归不起作用?,c#,C#,我需要删除字符串中的子字符串。我需要删除一个从特定字符开始直到另一个字符的字符串。这是我的代码: [Test] public static void TestDeleteSign() { var s = "РасчНал[]{@ТипНП}/РасчНалГруп[]{@СубРФ}/@ДоляНалБаз"; var result = DeleteSignature(s); var acceptResult = "Расч

我需要删除字符串中的子字符串。我需要删除一个从特定字符开始直到另一个字符的字符串。这是我的代码:

    [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: "РасчНал/РасчНалГруп[]{@СубРФ}/@ДоляНалБаз"

函数返回一个字符串。在函数的第一次迭代之后,将再次调用函数。不管发生了什么,您的代码将只返回一个删除的段落,因为您对
DeleteSignature
的递归执行不做任何操作。您需要返回递归执行的输出,如下所示:

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;
}

函数返回一个字符串。在函数的第一次迭代之后,将再次调用函数。不管发生了什么,您的代码将只返回一个删除的段落,因为您对
DeleteSignature
的递归执行不做任何操作。您需要返回递归执行的输出,如下所示:

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;
}

提示:
DeleteSignature语句
不会做任何有用的事情,因为您没有使用返回值…请尝试使用
s=DeleteSignature(s)@HenkHolterman你破坏了乐趣:(@CarbineCoder-我们不应该在这里(再)有乐趣了)。无论如何,这是一个初学者问题,但问得很好。任何人在问题中提出实际和预期结果都值得鼓励。@HenkHolterman,除了他们最初没有提出,这是在有人提示他们使用注释提示后由其他人编辑的:
deletesign(s)语句;
不会做任何有用的事情,因为您没有使用返回值…请尝试使用
s=DeleteSignature(s);
@HenkHolterman您破坏了乐趣:(@CarbineCoder-我们在这里(不再)应该有乐趣了).无论如何,这是一个初学者的问题,但问得很好。任何在问题中提出实际和预期结果的人都应该得到一些鼓励。@Henkholtman,除了他们最初没有,这是在有人提示他们发表评论后由其他人编辑的。我认为OP犯的错误是认为重新指定s的参考会影响将对象放在别处,但DeleteSignature的每个实例中对s的引用变量独立于对同一对象的其他引用。我认为OP犯的错误是认为重新分配s的引用会影响别处的对象,但DeleteSignature的每个实例中对s的引用变量独立于对同一对象的其他引用。