如何确保在递归调用期间不更改参数?

时间:2012-05-21 16:39:03

标签: 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没有改变是很重要的,因为有人可以很容易地做到这一点。哦,我无法触及“人”类。

如果直接无法做到这一点,是否有人知道可以安全解决此问题的模式?

1 个答案:

答案 0 :(得分:2)

如果您真的担心这一点,请考虑使用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));

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