我无法让“foreach”功能正常工作。当我在treeView中选择一个节点时,它应该显示每个子节点/孙子节点的时间总和(每个节点包含一个整数时间变量),就像通常的公司层次结构树示例一样,当选择了boss时,它应该总结下属的工资。但由于某种原因,它只是总结了孩子们的时代,它只能在下属名单中下降一步。
希望我想要达到的目标是明确的,如果没有,请告诉我,我会尝试进一步解释它!
// This is in the Form1 class and is calles when a node is selected in a treeView:
private void getTimeSum(ProductionElement prod)
{
int sum;
sum = prod.getSumOfTimes();
totalTimeLabel.Text = sum.ToString();
}
class CompositeElement : ProductionElement
{
//The composite class for the composite pattern
protected List<ProductionElement> subordinates = new List<ProductionElement>();
public int getSumOfTimes()
{
int sum;
foreach (var prodel in subordinates)
{
sum += prodel.getIdealTime();
}
return sum;
}
public int getIdealTime()
{
return idealTime;
}
}
答案 0 :(得分:1)
您需要使用递归 - 通常在这种情况下您只能在叶节点处拥有值...就像这样:
public int getSumOfTimes()
{
int sum;
if (subordinates.Count() == 0)
{
sum = getIdealTime();
}
else
{
foreach (var prodel in subordinates)
{
sum += prodel.getSumOfTimes();
}
}
return sum;
}
如果您在常规节点上也有数据,那么您需要在foreach之后添加对getIdealTime()的调用
答案 1 :(得分:1)
如果您的生产元素定义了getIdealTime
,那么您的复合元素应该定义一个getIdealTime
来考虑所有子元素。因此,您可能希望将getSumOfTimes
的代码放入getIdealTime
函数中。这样,列表中的其他复合元素将自动通过它们自己的列表来计算它们的值。
如果您不希望这样 - 虽然这将是复合模式的重点 - 那么您仍然可以修复您的实现以明确检查其他复合元素:
foreach (var prodel in subordinates)
{
if (prodel is CompositeElement)
sum += ((CompositeElement)prodel).getSumOfTimes();
else
sum += prodel.getIdealTime();
}
答案 2 :(得分:0)
要获得总和,请执行以下操作:
public int getSumOfTimes(List<ProductionElement> subordinates)
{
return subordinates.Sum(prodel => prodel.idealTime);
}