【问题标题】:If a class has a public List of a custom class, how do I know when List Item # (record number) I am using?如果一个类有一个自定义类的公共列表,我如何知道我何时使用列表项#(记录号)?
【发布时间】:2012-01-06 10:37:23
【问题描述】:

我正在尝试创建一个如下所示的进度条类。如果孩子剩余时间大于父母剩余时间,那么父母应该等于孩子剩余时间。

在下面的方法 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:

注意问题应该是:如果一个类包含一个自定义类的列表,我如何在列表项获取属性时获取类列表项#?

听起来我需要查找嵌套类,谢谢这个词。 也许这更清楚: 问题:子进度条的剩余时间 (ETA) 为 5 分钟。父进度条的 ETA 为 2 分钟,这具有误导性。因此也将父进度条设置为 5 分钟。

  1. 每个进度条都是列表中的一个类。即List&lt;MyProgressBar&gt;
  2. 每个进度条都需要计算 ETA。
  3. 在计算任何进度条的 ETA 时,检查它是否有子进度条,以及当前 ETA
  4. 我假设添加到列表中的每个项目都是上述项目的子项。 (可能是错误的假设)
  5. 由于每个进度条都是列表中的一个项目,因此如何: a) 我可以在类方法中获取当前列表索引号吗?即列表[编号]。 b)我可以访问其他列表项值(例如孩子开始时间)吗?即 List[childnum]。

想法: 1.当我休息时,我虽然可以重写 List.Add() 方法来插入项目 #?但是我必须保持这个值。

【问题讨论】:

  • 好的,但是如何在您的方案中建立父子关系?你怎么知道哪个 ProgressBarItem 是另一个的孩子?
  • 可能值得看一下Microsoft Naming Guidelines,代码有一些不一致,这是我最讨厌的。
  • 也许我需要重新假设添加的进度条是添加的最后一项的子项。

标签: c# progress-bar


【解决方案1】:

我对你的代码有点困惑

不过,在回答您的标题问题时,要在列表中查找 ProgressBarItem 的索引,您可以使用 IndexOf() 方法,具体取决于 CalcETA 代码最终运行的位置,您可能希望将其传递给 List,在这种情况下,您将使用 IndexOf(this) 或将 ListItem 传递给它,在这种情况下,您将使用 IndexOf(listItem)

我希望这对您最初的问题有所帮助,但目前的代码需要大量修改。

【讨论】:

  • 嵌套类是标准的 C#,尽管在 Java 中更常见。通常情况下,我会建议每种类型都有一个代码文件,但是如果类型分组是合适的,就像示例一样,那么对我来说似乎是合理的。
  • 这不是让我感到困惑的唯一一点,但回想起来我可能误读了其中的一部分。仍然没有任何迹象表明您要查找哪个进度条的子级。
  • 请参阅我上面的更新 1 中的问题文本。
【解决方案2】:

添加一个具有ProgressBarItem type(Parent)的属性,用于存储每个ProgressBarItem的父级,然后查找节点的子级:

var Childs=ProgressBarList.Where(p=>p.Parent==Node);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多