【问题标题】:Access all instances of class with foreach使用 foreach 访问类的所有实例
【发布时间】:2014-03-02 23:26:59
【问题描述】:

我无法让“foreach”功能正常工作。 When I select a node in the treeView it should display the sum of the times for each children/grandchildrens (every node contains an integer time variable) pretty much like the usual examples with hierarchy tree over a company and when a boss is selected it should总结下属的工资。但不知为何,它只是总结了孩子们的时代,可以说在下属名单上只下降了一级。

希望我想要达到的目标很清楚,如果不是,请告诉我,我会尝试进一步解释!

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

【问题讨论】:

  • foreach 工作得很好——你根本不了解复合模式。
  • @JohnSaunders 是的,你可能是对的!让我对示例中的模式感到困惑的是,有时用户应该为复合设置时间,有时应该使用叶子计算该复合的时间(以及该复合的父级等等)。更准确地说,活动(组合)基于基于元素(叶子)的子活动(组合)。但是,如果不想通过使用元素构建子活动来获得时间,则可以设置该子活动的时间,并且仍然可以正确地获得该活动的时间。

标签: c# foreach composite


【解决方案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() 的调用

【讨论】:

  • 是的,正如我在上面的答案中所说,我的复合模式全错了。但是我无法让您的任何代码工作,这很奇怪!不能在组合和叶子中都有数据,并且无论它是在叶子中还是在组合中,都不能对所有此类数据进行求和?
【解决方案2】:

如果您的生产元素定义了一个getIdealTime,那么您的复合元素应该定义一个考虑其所有子元素的getIdealTime。因此,您可能希望将getSumOfTimes 的代码放入getIdealTime 函数中。这样,您列表中的其他复合元素将自动通过自己的列表来计算它们的值。

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

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

【讨论】:

  • 是的,你是对的,看来我的复合模式有点错误。问题是用户可以选择是否要为节点设置时间或使用叶子 IdealTime 计算它(但叶子与复合材料不一样,所以我不能只使用复合材料)。我无法让它工作,我尝试了你的代码以及 Hogans,但现在无论我选择什么,它都显示“0”。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多