我有以下课程:
public class Person
{
public Person(string name, bool include, int age)
{
this.Name = name;
this.Include = include;
this.Age = age;
}
public string Name { get; set; }
public bool Include { get; set; }
public int Age { get; set; }
public List<Person> Childs { get; set; }
}
我以这种方式创建对象:
var Persons = new List<Person>();
Persons.Add(new Person("Eric", true, 12));
Persons[0].Childs = new List<Person>();
Persons[0].Childs.Add(new Person("Tom", false, 13));
Persons[0].Childs.Add(new Person("John", true, 10));
Persons[0].Childs[0].Childs = new List<Person>();
Persons[0].Childs[0].Childs.Add(new Person("Bill", true, 23));
Persons[0].Childs.Add(new Person("Paul", true, 100));
Persons.Add(new Person("John", true, 12);
Persons[1].Childs = new List<Person>();
Persons[1].Childs.Add(new Person("Jay", true, 15));
Persons[1].Childs[0].Childs = new List<Person>();
Persons[1].Childs[0].Childs.Add(new Person("Billy", true, 23));
这将产生以下树:
-Eric (true, 12)
-Tom (false, 13)
-John (true, 10)
-Bill (true, 23)
-Paul (true, 100)
-John (true, 12)
-Jay (false, 15)
-Billy (true, 23)
我想要做的是创建一个函数,该函数根据以下算法返回最大的年龄总和,其中Include设置为true
:
false
时,即使将“包括”设置为true,也将忽略该子节点的所有子节点。因此,请从上至下计算所有直接方法,其中将Include设置为true并返回最大的方法。
示例:首先计算:
然后返回总和的最高值:112
编辑: 到目前为止我尝试过的
public int GetMax(Person p){
foreach(var pi in p){
if(pi.Include) {
// how do I save sums?
}
}
}
答案 0 :(得分:1)
您可以使用递归进行此操作,但是您也可以在班级中将其删除。
internal class Person
{
...
public int MaxStuff => Include ? Age + (Childs?.Max(x => x.MaxStuff) ?? 0) : 0;
}
用法
var total = persons.Max(x => x.MaxStuff);
或递归
public static int MaxStuff(Person p)
=> p.Include ? p.Age + (p.Childs?.Max( MaxStuff) ?? 0) : 0;
用法
var total = persons.Max(MaxStuff);