c# - 如何确保递归调用期间参数不被更改?

标签 c# recursion parameters

我有一些数据需要传递给递归函数。我想确保它在该函数内没有改变。我怎样才能做到这一点?

考虑:

    static List<Person> GetPeopleWithSameNameAncestors(List<Person> people)
    {
        return people.Where(person => HasAncestorWithName(person.Parents, person.Name)).ToList();
    }

    //Here, nameToLookFor is always the same for every outside call to this function
    static bool HasAncestorWithName(List<Person> lookIn, String nameToLookFor)
    {
        return lookIn.Any(p => p.Name == nameToLookFor || (p.Parents != null && HasAncestorWithName(p.Parents, nameToLookFor)));
    }

实际情况更为复杂,这就是为什么确保 nameToLookFor 不被更改很重要,因为有人可以轻松地做到这一点。哦,我不能碰“Person”类。

如果这不能直接实现,是否有人知道可以安全解决此问题的模式?

最佳答案

如果您确实担心这一点,请考虑使用 Decorator Pattern包装你的 Person 对象 - 但包装它,以使其不可变。

public class PersonWrapper()
{
    Person p;

    public PersonWrapper(Person person)
    {
        prop = person;
    }

    Public string Name
    {
        get { return p.Name; }
    }
}

在代码中传递此对象 - 您可以轻松转换列表,例如:

var immutablePersonList = personList.Select(p => new PersonWrapper(p));

此外,使用不可变集合类型(例如 IEnumerable)而不是可变 ICollection 实现。

关于c# - 如何确保递归调用期间参数不被更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10689107/

相关文章:

c++ - 递归斐波那契数列

c# - 参数前的@符号是什么

ASP.NET 使用response.redirect传递参数而不显示在url中

C# DLL 菜鸟,如何获取函数

java - JAVA从字母表的相反端找到对应的字母并递归地从字符串中删除

c# - Xdocument - 删除除最后一个元素之外的重复元素 c#

java - 如何找到具有相同值的所有相邻像素而不遇到当前的 StackOverflowError 问题?

Swift:在 View 之间传递多个值

c# - 你如何创建一个类似英语的单词?

javascript - 实时更改 Repeater 内的标签