如何从列表中随机取一个项目然后防止其重复? [英] How do I take one item randomly from a list then prevent its repeatition?

查看:78
本文介绍了如何从列表中随机取一个项目然后防止其重复?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的列表:

 List< string> numbers =  new  List< string>(); 
numbers.Add( 1);
numbers.Add( 2);
numbers.Add( 3);
numbers.Add( 4);
numbers.Add( 5);
numbers.Add( 6);
numbers.Add( 7);
numbers.Add( 8);
numbers.Add( 9);
numbers.Add( 10);
numbers.Add( 11);
numbers.Add( 12);
numbers.Add( 13);
numbers.Add( 14);
numbers.Add( 15);
numbers.Add( 16);
numbers.Add( 17);
numbers.Add( 18);
numbers.Add( 19);
numbers.Add( 20);
numbers.Add( 21);
numbers.Add( 22);
numbers.Add( 23);
numbers.Add( 24);
numbers.Add( 25);
numbers.Add( 26);
numbers.Add( 27);
numbers.Add( 28);
numbers.Add( 29);
numbers.Add( 30);
numbers.Add( 31);
numbers.Add( 32);
numbers.Add( 33);
numbers.Add( 34);
numbers.Add( 35);



现在我想完成3个任务:

1:随机取一个成员。

2:阻止显示的数字重复

3:能够重新启动列表。(比如重置列表,这样任何号码都可以再次出现,但仍然会重复一次)

提前感谢您的所有帮助...

解决方案

首先,您不必单独指定数字:

 List< string> numbers = Enumerable.Range( 1  28 )。选择(i = >  i.ToString())。ToList(); 

将很好地填充它。

您可以创建列表的副本稍后重置非常容易:

 List< string> original = numbers.ToList(); 



随机获取一个?同样简单:

 私人随机rand =  new  Random(); 
...
int index = rand.Next(numbers.Count);
string value = numbers [index];



为了防止重复,只需添加一行:

 numbers.RemoveAt(index ); 





愚蠢的HTML标签自动完成... [/ edit]


< blockquote>我会生成一个随机序列并将其存储在一个列表中:

  var  rnd =  new  Random(); 
var list = Enumerable.Range( 1 35
。选择(x = > new {Value = x,SortKey = rnd.Next()})
.OrderBy(x = > x.SortKey)
。选择(x = < span class =code-keyword>> x.Value)
.ToList();



然后你可以轻松选择第一名一个人。如果你要重置那么你只需将指针移动到第一个元素。或者,您可以生成新列表。


I have a list like this:

List<string> numbers = new List<string>();
            numbers.Add("1");
            numbers.Add("2");
            numbers.Add("3");
            numbers.Add("4");
            numbers.Add("5");
            numbers.Add("6");
            numbers.Add("7");
            numbers.Add("8");
            numbers.Add("9");
            numbers.Add("10");
            numbers.Add("11");
            numbers.Add("12");
            numbers.Add("13");
            numbers.Add("14");
            numbers.Add("15");
            numbers.Add("16");
            numbers.Add("17");
            numbers.Add("18");
            numbers.Add("19");
            numbers.Add("20");
            numbers.Add("21");
            numbers.Add("22");
            numbers.Add("23");
            numbers.Add("24");
            numbers.Add("25");
            numbers.Add("26");
            numbers.Add("27");
            numbers.Add("28");
            numbers.Add("29");
            numbers.Add("30");
            numbers.Add("31");
            numbers.Add("32");
            numbers.Add("33");
            numbers.Add("34");
            numbers.Add("35");


Now I want to achieve 3 tasks:
1: take one of the members randomly.
2: prevent the shown number to repeat
3: being able to restart the list.(like resetting the list so any number can come again but still repeated ONCE)
Thanks in advance for all your help...

解决方案

First off, you don't have to specify the number individually:

List<string> numbers = Enumerable.Range(1, 28).Select(i => i.ToString()).ToList();

Will fill it nicely.
And you can create a copy of the list for later "reset" very easily:

List<string> original = numbers.ToList();


Get one randomly? Also simple:

private Random rand = new Random();
...
    int index = rand.Next(numbers.Count);
    string value = numbers[index];


And to prevent repetition, just add one line:

numbers.RemoveAt(index);



[edit]Stupid HTML tag autocomplete...[/edit]


I would generate a random sequence and store it in a list:

var rnd = new Random();
var list = Enumerable.Range(1, 35)
	.Select(x => new {Value = x, SortKey = rnd.Next()})
	.OrderBy(x => x.SortKey)
	.Select(x => x.Value)
	.ToList();


Then you can easily select number one by one. If you which to reset then you just simply move the pointer to the first element. Alternatively you can generate a new list.


这篇关于如何从列表中随机取一个项目然后防止其重复?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆