我有Windows.Forms.FlowLayoutPanel
在运行时使用MasterMeter
类型的控件(以及从MasterMeter继承的控件)填充。这是您的标准Usercontrol
。每个控件都有一个属性ErrorTime
。此值保持当前错误或警报的持续时间。
Datetime? ErrorTime {get; set;}
我目前正在尝试根据错误的持续时间(降序)使用bubblesort-method
对控件进行排序。现在我想知道有更快/更高性能/更可靠的方法吗?
如果没有,我可以使用另一个容器吗? 它需要具有以下特征:
当前代码(不会排序)
我正在使用1D阵列来保持简单(实际上它是一个锯齿状阵列)。
注意:NULL
值的可能性
MasterMeter[] meterList = {new MasterMeter() { ErrorTime = null },
new MasterMeter() { ErrorTime = DateTime.Now },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(37) },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(53) },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(3) },
new MasterMeter() { ErrorTime = null },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-17) },
new MasterMeter() { ErrorTime = DateTime.Now.AddDays(-10) },
new MasterMeter() { ErrorTime = null }
};
我Bubblesorting
如下:
for (int outer = 0; outer < meterList.Count(); outer++)
{
for (int inner = 0; inner < (meterList.Count() - 1); inner++)
{
if (meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime)
{
var temp = meterList[inner + 1];
meterList[inner + 1] = meterList[inner];
meterList[inner] = temp;
}
}
}
我的输出结果(使用Console.Writeline
):
foreach (MasterMeter meterlist in meterList)
{
Console.WriteLine(meterlist.ErrorTime);
}
Console.ReadLine();
但是我的数组仍未排序。这里出了什么问题?
答案 0 :(得分:1)
您必须决定如何处理列表中的空值,因为它会干扰您的冒泡排序:
if (!meterList[inner].ErrorTime.HasValue ||
meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) {
至于重新排序FlowLayoutPanel中的控件,您的帖子中缺少该代码,但一般情况下,您可以使用FlowLayoutPanel.Controls.SetChildIndex
方法重新排序控件。