添加数据后,用C#按字母顺序对复选框列表进行就地排序
控件(添加数据后,用C#按字母顺序对复选框列表进行就地排序,c#,asp.net,sorting,checkboxlist,C#,Asp.net,Sorting,Checkboxlist,控件(ListItems)是动态创建的,因此无法对插入前进行排序 我尝试了一个解决方案,它可以完成这项工作(在列表上排序,然后重建控件),但我想要一个更优雅的解决方案 为了完整起见,以下是我当前的解决方案: List<ListItem> lli = new List<ListItem>(); foreach (ListItem item in cblGIFFlags.Items) lli.Add(item); cblGIF
ListItems
)是动态创建的,因此无法对插入前进行排序
我尝试了一个解决方案,它可以完成这项工作(在列表上排序,然后重建控件),但我想要一个更优雅的解决方案
为了完整起见,以下是我当前的解决方案:
List<ListItem> lli = new List<ListItem>();
foreach (ListItem item in cblGIFFlags.Items) lli.Add(item);
cblGIFFlags.Items.Clear();
bool sorting = true;
while (sorting)
{
sorting = false;
for (int i = 0; i < lli.ToArray().Length - 1; i++)
{
ListItem x = lli[i];
ListItem y = lli[i + 1];
if (Comparer<String>.Default.Compare(x.Text,y.Text) > 0)
{
lli[i] = y;
lli[i + 1] = x;
sorting = true;
}
}
}
foreach (ListItem item in lli) cblGIFFlags.Items.Add(item);
List lli=新列表();
foreach(cblGIFFlags.Items中的ListItem项目)lli.Add(项目);
cblGIFFlags.Items.Clear();
布尔排序=真;
while(排序)
{
排序=假;
对于(int i=0;i0)
{
lli[i]=y;
lli[i+1]=x;
排序=真;
}
}
}
foreach(lli中的ListItem项)cblGIFFlags.Items.Add(项);
由于实现了IEnumerable,我想也许我可以强制转换为IEnumerable之类的。我不知道该怎么做。以下是我能想到的最好的:
var items = new List<ListItem>();
foreach (ListItem item in listBox.Items) items.Add(item);
listBox.Items.Clear();
listBox.Items.AddRange(items.OrderBy(i=>i.Value).ToArray());
var items=newlist();
foreach(listBox.Items中的ListItem项目)Items.Add(项目);
listBox.Items.Clear();
Items.AddRange(Items.OrderBy(i=>i.Value.ToArray());
气泡排序的实现
我相信每个人都熟悉它?@Ashburaczenko非常肯定Op说了尝试过的东西——手动排序并重新构造控件。@dbaseman完全正确。添加实现是完全没有意义的,只是用完全不可逆的代码来解决所有问题,这对解决这个问题是没有帮助的(我想它能以一种方式解决这个问题……)DasBeman,这就是为什么我说Studio不告诉的原因。虽然这是一个更优雅的解决方案,但它并没有排序到位。。您仍然需要添加/清除/添加项。@hkf是的,我不知道这是什么类型的集合(ListItemCollection),但它不支持正常的Linq操作。请注意,要使上述功能正常工作,您需要添加对System.Linq.dll的引用。