2012-02-13 98 views
0

我有一个列表,可以有一个可变数量的项目(但不超过30个,所以没有性能问题),我想获得最多10个随机项目,我写了一段代码,列表中有10多个项目。下面的代码的问题是,如果列表中少于10个项目并且如果少于10个项目我想以随机顺序显示它们,它显然不会随机化结果。如何从列表中获得最多10个随机项目?

var keyPersons = people.ToList(); 
Random rnd = new Random(); 
while (keyPersons.Count() > 10) 
{ 
    int j = rnd.Next(0, keyPersons.Count()); 
    keyPersons.RemoveAt(j); 
} 

rptKeyPersons.DataSource = keyPersons; 

如果在人员列表中只有5个项目,我该如何随机化结果?

在此先感谢。

+2

您的代码将删除随机点的物品,直到剩下10个物品。如果您的项目少于10个,那么您最终只会列出已有的列表。那么问题是什么?你需要一个随机*订购*?在任何一种情况下,我都可能只是将名单洗牌并拿出前10项,显然允许少于10项可能存在,根据你的规则听起来很好。 – 2012-02-13 04:24:54

+0

是啊对不起,我更新了一些问题,如果有少于10我想他们都在随机顺序。 – user997685 2012-02-13 04:25:58

+0

用于洗牌列表:http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp – mshsayem 2012-02-13 04:30:13

回答

4

鉴于评论中的说明需要随机排序,您可以对列表进行洗牌,然后按顺序简单取n项目。请注意,即使您的列表中有超过10个项目,您的方法仍然不包括随机化这些结果,而是消除随机点上的元素。剩下的元素仍然是原来的顺序。这将解决这两个问题。

鉴于

public static void Shuffle<T>(IList<T> list) 
{ 
    var random = new Random(); 
    for (int index = list.Count - 1; index >= 1; index--) 
    { 
     int other = random.Next(0, index + 1); 
     T temp = list[index]; 
     list[index] = list[other]; 
     list[other] = temp; 
    } 
} 

你可以有

var keyPersons = people.ToList(); 
Shuffle(keyPersons); 
rptKeyPersons.DataSource = keyPersons.Take(10); 

Take将选择新鲜洗牌序列中的第10个项目。如果少于10个,则只需要尽可能多的数量。

0

我喜欢Anthonies解决方案,但它可以像这样简单。

var keyPersons = people.OrderBy(x => Guid.NewId()).ToList() 
rptKeyPersons.DataSource = keyPersons.Take(10); 
相关问题