我有一些数据需要传递给递归函数。我想确保它在该函数内没有改变。我怎样才能做到这一点?
考虑:
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/