使用foreach访问所有类的实例

时间:2014-03-02 14:53:14

标签: c# foreach composite

我无法让“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;
    }
}

3 个答案:

答案 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);
}