Если у класса есть общедоступный список пользовательских классов, как мне узнать, когда я использую элемент списка # (номер записи)? - PullRequest
0 голосов
/ 25 ноября 2011

Я пытаюсь создать класс индикатора выполнения, как показано ниже.Если оставшееся время ребенка больше, чем оставшееся время родителей, тогда родители должны равняться оставшемуся времени ребенка.

В методе CalcETA () ниже я испытываю трудности с доступом к свойствам ребенка.Я подумала, что если я знаю, что за элемент списка №, я могу каким-то образом получить доступ к значениям ProgressBarList [myIndex + 1] ...

public class ProgressBars
//NOTE: Not working yet
// used to keep track of multiple progress bars and the time remaining.
// recommended to set as default: Min = 1, Max = 100, Step = 1, Value = 1 in progress bar property control.
{
  public List<ProgressBarItem> ProgressBarList;

  public bool Started { get; set; }       // set to true if you want to keep track of when to update bars on form.
  public string Status { get; set; }      // general text

  public class ProgressBarItem
  {
    public bool HasChild { get; set; }     // if HasChild = True then parent TimeRemaining must not be less than childs.
    public int Maximum { get; set; }
    public int Value { get; set; }
    public string Text { get; set; }
    public DateTime StartTime { get; set; }
    public TimeSpan TimeRemaining { get { return CalcETA(HasChild, StartTime, Value, Maximum); } }
    public TimeSpan ElapsedTime { get { return DateTime.Now - StartTime; } }
  }

  private static TimeSpan CalcETA(bool HasChild, DateTime StartTime, int counter, int counterGoal)
  {  // Calculate the time remaining for the process
    if (HasChild)  
    {
      //TODO: How do I get the child's StartTime?
      TimeSpan timeElapsed = DateTime.Now - StartTime;
      return GetETAFromTimeElapsed(timeElapsed, counter, counterGoal);
    }
    else
    {
      TimeSpan timeElapsed = DateTime.Now - StartTime;
      return GetETAFromTimeElapsed(timeElapsed, counter, counterGoal);
    }
  }


  private static TimeSpan GetETAFromTimeElapsed(TimeSpan ts, int Counter, int CounterMax)
  {
    if (Counter != 0)  // do not divide by zero
    {
      double minLeft = (ts.TotalMinutes / Counter) * (CounterMax - Counter);
      return TimeSpan.FromMinutes(minLeft);
    }
    else
      return default(TimeSpan);
  }

ОБНОВЛЕНИЕ 1:

Примечание Вопрос должен гласить: если класс содержит список пользовательских классов, как я могу получить класс List Item # при работе со свойством get элемента списка?

Похоже, мне нужно искать вложенные классыСпасибо за срок.Может быть, это яснее: Проблема: у дочернего индикатора выполнения есть оставшееся время (ETA) 5 минут.Родительский индикатор выполнения имеет ETA 2 минуты, что вводит в заблуждение.Поэтому установите родительский индикатор выполнения также на 5 минут.

  1. Каждый индикатор выполнения является классом в списке.т. е. List<MyProgressBar>
  2. Каждый индикатор выполнения должен рассчитывать ETA.
  3. При расчете ETA для любого индикатора выполнения проверьте, есть ли у него индикатор выполнения дочернего элемента и если текущее ETA <дочернее ETA, используйте ETA дочернего элемента.. </li>
  4. Я предполагаю, что каждый элемент, добавленный в список, является дочерним по отношению к вышеуказанному.(возможно, неверное предположение)
  5. Поскольку каждый индикатор выполнения является элементом списка, как: a) можно ли получить текущий индексный номер списка внутри методов класса?т.е. список [номер].б) Могу ли я получить доступ к другим значениям элемента списка (например, дочернему звездному времени)?т.е. List [childnum].

Мысли: 1. Поскольку я делал перерыв, я думал, что могу переопределить метод List.Add (), чтобы вставить элемент #?Но тогда я должен сохранить это значение.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Я немного смущен вашим кодом

В ответ на ваш заглавный вопрос, однако, чтобы найти индекс ProgressBarItem в списке, вы можете использовать метод IndexOf (), в зависимости от того, где заканчивается код CalcETA, вы либо захотите передать ему список, в этом случае вы используете IndexOf (this) или передаете его ListItem; в этом случае вы используете IndexOf (listItem)

Надеюсь, это поможет вам в вашем первоначальном вопросе: этот код в его нынешнем виде нуждается в существенной переработке.

0 голосов
/ 25 ноября 2011

Добавьте свойства с типом ProgressBarItem (Parent) , которые хранят родительский элемент для каждого ProgressBarItem, затем для поиска дочерних элементов узла:

var Childs=ProgressBarList.Where(p=>p.Parent==Node);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...