2

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

考虑:

    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”类。

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

4

1 回答 1

2

如果您真的对此感到担心,请考虑使用装饰器模式来包装您的 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 实现。

于 2012-05-21T16:53:58.660 回答