gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:51 25 4
gpt4 key购买 nike

我有一些数据需要传递给递归函数。我想确保它在那个函数中没有改变。我该怎么做?

考虑:

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com