如果一个类有一个自定义类的公共列表,我如何知道我何时使用列表项#(记录号)
本文关键字:列表 何知道 何时使 记录 一个 有一个 自定义 如果 | 更新日期: 2023-09-27 18:15:39
我正在尝试创建一个进度条类,如下所示。如果子节点的剩余时间大于父节点的剩余时间,则父节点的剩余时间应该等于子节点的剩余时间。
在下面的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,当我在List Item get属性中工作时,我如何获得类List item# ?
听起来像我需要查找嵌套类,感谢术语。也许这样更清楚:问题:子进度条的剩余时间(ETA)为5分钟。父进度条显示预计到达时间为2分钟,这是误导。因此,也将父进度条设置为5分钟。
- 每个进度条都是列表中的一个类。即
List<MyProgressBar>
- 每个进度条都需要计算ETA。
- 当计算任何进度条的预计到达时间时,检查它是否有子进度条以及当前的预计到达时间
- 我假设列表中添加的每个项目都是上述项目的子项目。(可能是错误的假设)
- 既然每个进度条都是列表中的一个项目:a)我可以在类方法中获得当前列表索引号吗?即列表(num)。b)我可以访问其他列表项值(如儿童startime)吗?即列表(childnum)。
的思想:1. 当我休息时,我认为我可以重写List.Add()方法来插入项目#?但是我必须保持这个值
我对你的代码有点困惑
在回答你的标题问题虽然,找到列表中的ProgressBarItem的索引,你可以使用IndexOf()方法,这取决于CalcETA代码最终运行的地方,你要么要传递它的列表,在这种情况下,你会使用IndexOf(this)或你传递它的listtitem在这种情况下,你会使用IndexOf(listtitem)
我希望这对你最初的问题有一些帮助,代码,因为它的存在需要重大的修改。
添加一个属性ProgressBarItem类型(Parent),用于存储每个ProgressBarItem的父元素,然后查找节点的子元素:
var Childs=ProgressBarList.Where(p=>p.Parent==Node);