Доступ ко всем экземплярам класса с помощью foreach

Я не могу заставить функцию "foreach" работать должным образом. Когда я выбираю узел в treeView, он должен отображать сумму времени для каждого ребенка / внука (каждый узел содержит целочисленную переменную времени) почти так же, как обычные примеры с иерархическим деревом в компании, и когда босс выбран, он должен Подводим зарплату подчиненным. Но по какой-то причине он только подводит итог детским временам, он лишь на шаг опускается в списке, так сказать, подчиненных.

Надеюсь, что я пытаюсь достичь, ясно, если нет, пожалуйста, скажите мне, и я постараюсь объяснить это дальше!

// 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 ответа

Решение

Вам нужно использовать рекурсию - обычно в таком случае у вас будут только значения на листовом узле... вот так:

public int getSumOfTimes()
{
     int sum;

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

Если у вас есть данные и на обычном узле, вам нужно добавить вызов getIdealTime() после foreach

Если ваш производственный элемент определяет getIdealTimeто ваш составной элемент должен определить getIdealTime это учитывает всех его детей. Таким образом, вы хотели бы поставить код для getSumOfTimes в 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);
}
Другие вопросы по тегам