如何随机随机播放列表框中的当前项?
我有这个代码,但它非常慢且效率低 -
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;
}
}
虽然这段代码在技术上工作,但它很慢并且没有提供很多变化,通常会给予相同的少量改组。
我一直在谷歌搜索最后小时并且无法找到解决方案。我的头发用完了。
感谢。
答案 0 :(得分:2)
我猜您正在使用winforms
,ListBox
有一对方法BeginUpdate
和EndUpdate
用于快速更新项目(无需重新绘制),更换物品时重新粉刷是减慢一切的原因之一。另请注意,此处不需要任何强制转换,可能会使代码变慢一些,请尝试以下操作:
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)
尝试Fisher-Yates shuffle:http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle