在ListBox中混洗项目

时间:2017-12-07 15:18:19

标签: c# winforms

我的系统包含ListBox中的整数。我添加了一个“随机播放”Button,当用户点击时,它应该将ListBox中存储的项目随机排列为随机顺序。

但是,我使用的代码不适用于此。有没有人对如何生成随机按钮来随机化ListBox内的数据有任何建议?

3 个答案:

答案 0 :(得分:1)

我不知道为什么要将它存储在buttonShuffle.ObjectCollection类型的变量中。

只需访问ListBox的Items属性:

while (n > 1)
{
    n--;
    int k = rng.Next(n + 1);
    object value = listBoxAddedIntegers.Items[k];
    listBoxAddedIntegers.Items[k] = listBoxAddedIntegers.Items[n];
    listBoxAddedIntegers.Items[n] = value;
}

如果您因为想要更短的名字而这样做,请使用ListBox.ObjectCollectionvar

var items = this.listBoxAddedIntegers.Items;

while (n > 1)
{
    n--;
    int k = rng.Next(n + 1);
    object value = items[k];
    items[k] = items[n];
    items[n] = value;
}

答案 1 :(得分:1)

让您的生活更轻松,使用DataTable来保存您的列表项,为其添加另一个可以分类的列:

//this is a class wide variable
DataTable _d = new DataTable();

//in your constructor
_d.Columns.Add("DisplayThis");
_d.Columns.Add("SortThis", typeof(int));

_d.DefaultView.Sort = "[SortThis] ASC";

yourListBox.DataSource = _d.DefaultView;
yourListBox.DisplayMember = "DisplayThis";

//in your method that formerly loaded the listbox items
Random r = new Random();
foreach(string s in yourListItemsToDisplayArray) 
  d.Rows.Add(new object[] { s, (int)r.Next(1000) }); 

//or if the listbox is to show numbers
Random r = new Random();
foreach(int i in yourListItemsToDisplayArray) 
  d.Rows.Add(new object[] { i.ToString(), (int)r.Next(1000) }); 

每当你想要改变它们时,只需要传递数据表,改变数字:

//your shuffle button click handler
shuffleButton_Click(object sender, ClickEventArgs e){
  Random r = new Random();
  foreach(var ro in _d.Rows)
    ro["SortThis"] = r.Next(1000);
}

答案 2 :(得分:0)

这一行

buttonShuffle.ObjectCollection list = listBoxAddedIntegers.Items;

毫无意义。编译器将尝试创建一个名为list的{​​{1}}类型的变量,我假设它不是有效的类型。

认为您需要做的是让buttonShuffle.ObjectCollection成为list(或List<int>),然后从{{填充var 1}}在方法结束时,使用适合该操作的任何方法(Add,AddRange等)