我有一个
Windows.Forms.FlowLayoutPanel
,在运行时用 MasterMeter
类型的控件(以及从 MasterMeter 继承的控件)填充。这就是你的标准Usercontrol
。每个控件都有一个属性 ErrorTime
。该值保留当前错误或警报的持续时间。
Datetime? ErrorTime {get; set;}
我目前正在尝试根据错误的持续时间(降序)使用
bubblesort-method
对控件进行排序。现在我想知道是否有更快/更高效/更可靠的方法来做到这一点?
如果没有,我可以使用另一个容器吗? 它需要具有以下特性:
当前代码(不会排序)
我使用一维数组来保持简单(实际上它是一个锯齿状数组)。 注意:
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();
但是我的数组仍然没有排序。这里出了什么问题?
您必须决定如何处理列表中的那些空值,因为它确实会干扰您的冒泡排序:
if (!meterList[inner].ErrorTime.HasValue ||
meterList[inner].ErrorTime > meterList[inner + 1].ErrorTime) {
就重新排序 FlowLayoutPanel 中的控件而言,您的帖子中缺少该代码,但一般来说,您可以使用
FlowLayoutPanel.Controls.SetChildIndex
方法来重新排序控件。
我刚刚读到这篇文章,我不确定答案是否真的令人信服,我们可以悄悄打赌,未来十年内很多人将拥有在 FlowLayoutPanels 中进行排序的控件。
我遇到了 FlowLayoutPanel 未按我想要的顺序显示控件的问题。
当我在每次修改时清除控件时,在从 TableAdapter 再次加载它们(到 DataSet)之前,我所要做的就是更正 TableAdapter 的查询,以便它按照我想要的顺序填充 DataSet。
然后,FlowLayoutPanel的控件按照DataSet的顺序加载。
在这里的提案中,我看到了 SetChildIndex :这意味着您必须浏览 FlowLayoutPanel 中的控件集合,并为每个控件提供您想要的索引。
同时操作两者并比较所需的时间会很有趣。但有一点没有说:当避免清除控件以再次填充它们时,使用什么方法来确定每个控件的索引。
在这种情况下,我想你必须注意你的代码是可读的。