随机混洗listBox项目C#

时间:2013-12-02 21:18:03

标签: c# winforms random listbox shuffle

如何随机随机播放列表框中的当前项?

我有这个代码,但它非常慢且效率低 -

private void shuffleItemsToolStripMenuItem_Click(object sender, EventArgs e)
{
   ListBox.ObjectCollection list = listBox1.Items;
   Random rng = new Random();
   int n = list.Count;
   while ( n > 1 )
   {
      n--;
      int k = rng.Next(n + 1);
      string value = (string)list[k];
      list[k] = list[n];
      list[n] = value;
   }
}

虽然这段代码在技术上工作,但它很慢并且没有提供很多变化,通常会给予相同的少量改组。

我一直在谷歌搜索最后小时并且无法找到解决方案。我的头发用完了。

感谢。

2 个答案:

答案 0 :(得分:2)

我猜您正在使用winformsListBox有一对方法BeginUpdateEndUpdate用于快速更新项目(无需重新绘制),更换物品时重新粉刷是减慢一切的原因之一。另请注意,此处不需要任何强制转换,可能会使代码变慢一些,请尝试以下操作:

private void shuffleItemsToolStripMenuItem_Click(object sender, EventArgs e) {
   ListBox.ObjectCollection list = listBox1.Items;       
   Random rng = new Random();
   int n = list.Count;
   //begin updating
   listBox1.BeginUpdate();
   while ( n > 1 ) {
    n--;
    int k = rng.Next(n + 1);
    object value = list[k];
    list[k] = list[n];
    list[n] = value;
   }
   listBox1.EndUpdate();
   listBox1.Invalidate();
}

但是我同意即使不使用上面的一些调整,你的代码也不应该运行得这么慢。

答案 1 :(得分:0)