Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用foreach访问类的所有实例_C#_Foreach_Composite - Fatal编程技术网

C# 使用foreach访问类的所有实例

C# 使用foreach访问类的所有实例,c#,foreach,composite,C#,Foreach,Composite,我无法使foreach函数正常工作。当我在树视图中选择一个节点时,它应该显示每个子/孙辈的时间总和。每个节点都包含一个整数时间变量,这与公司层级树的常见示例非常相似。当选择一个老板时,它应该汇总下属的工资。但出于某种原因,它只总结了孩子们的时代,可以说,它在下属名单中只落后了一步 希望我的目标是明确的,如果没有,请告诉我,我会进一步解释 // This is in the Form1 class and is calles when a node is selected in a treeVie

我无法使foreach函数正常工作。当我在树视图中选择一个节点时,它应该显示每个子/孙辈的时间总和。每个节点都包含一个整数时间变量,这与公司层级树的常见示例非常相似。当选择一个老板时,它应该汇总下属的工资。但出于某种原因,它只总结了孩子们的时代,可以说,它在下属名单中只落后了一步

希望我的目标是明确的,如果没有,请告诉我,我会进一步解释

// 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;
    }
}

您需要使用递归-在这种情况下,通常在叶节点上只有值。。。像这样:

public int getSumOfTimes()
{
     int sum;

     if (subordinates.Count() == 0)
     {
       sum =  getIdealTime();
     }
     else
     {
       foreach (var prodel in subordinates)
       {
         sum += prodel.getSumOfTimes();
       }
     }
     return sum;
}

如果在常规节点上也有数据,那么需要在foreach之后添加对getIdealTime的调用。如果生产元素定义了getIdealTime,那么复合元素应该定义一个考虑其所有子元素的getIdealTime。因此,您可能希望将getsumoftime的代码放在getIdealTime函数中。这样,列表中的其他组合元素将自动通过它们自己的列表来计算它们的值

如果您不希望这样做,尽管这是关于复合模式的要点,那么您仍然可以修复您的实现,以明确地检查其他复合元素:

foreach (var prodel in subordinates)
{
    if (prodel is CompositeElement)
        sum += ((CompositeElement)prodel).getSumOfTimes();
    else
        sum += prodel.getIdealTime();
}

要获得总和,请执行以下操作:

public int getSumOfTimes(List<ProductionElement> subordinates)
{
     return subordinates.Sum(prodel => prodel.idealTime);
}

是的,你是对的,我好像把合成图案弄错了。问题是,用户可以选择是否要为节点设置时间,或者使用leafs idealTime计算时间,但leaf与composite并不完全相同,因此我不能只使用composites。但是我无法让它工作,我尝试了你的代码以及Hogans,但是现在无论我选择什么,它都显示为0。是的,我的复合模式完全错了,正如我在上面的回答中所说的。但是我不能让你的任何代码工作,这很奇怪!难道一个人不能同时拥有复合材料和叶子中的数据,并将所有这类数据相加,无论是叶子还是复合材料中的数据吗?foreach工作得很好-你根本不了解复合模式。@JohnSaunders是的,你可能是对的!在我的示例中,让我感到困惑的是,有时用户应该为复合设置时间,有时该复合的时间以及该复合的父级时间等等应该使用leaf计算。更准确地说,活动a组合基于基于元素叶的子活动组合。但是,如果不想通过使用元素构建子活动来获得时间,可以设置该子活动的时间,但仍然可以获得正确的活动时间。