2010-08-16 92 views
1

我有一个场景,我有一个类的列表,我想混淆的顺序。例如:要使用哪种集合类型?

private List<Question> myQuestions = new List<Question>(); 

因此,鉴于现在已经填充了一组数据,我想混淆顺序。我的第一个想法是创建一个从1到myQuestions.Count编号的整数集合,随机地为每个问题分配一个整数,然后按顺序循环遍历它们;不过,我似乎无法找到合适的收集类型用于此目的。我的意思的一个例子是这样的:

for (int i = 0; i <= myQuestions.Count -1; i++) 
    tempCollection[i] = myQuestions[rnd.Next(myQuestions.Count-1)]; 

但我不知道tempCollection应该是什么 - 它只是需要一个单一的价值,我可以删除,因为我用它。有没有人有任何建议使用哪种类型,或有更好的方法来做到这一点?

回答

3

我建议你把结果复制到一个新的List<Question>然后洗牌。

但是,我会使用Fisher-Yates shuffle而不是您在这里给出的。在这个网站上有很多C#的例子。

例如,你可以这样做:

// Don't create a new instance of Random each time. That's a detail 
// for another question though. 
Random rng = GetAppropriateRandomInstanceForThread(); 

List<Question> shuffled = new List<Question>(myQuestions); 
for (int i = shuffled.Count - 1; i > 0; i--) 
{ 
    // Swap element "i" with a random earlier element it (or itself) 
    int swapIndex = rng.Next(i + 1); 
    Question tmp = shuffled[i]; 
    shuffled[i] = shuffled[swapIndex]; 
    shuffled[swapIndex] = tmp; 
} 
+0

是不是shuffled.Count()? – 2010-08-18 15:04:34

+0

@ pm_2:它实际上应该是'shuffled.Count - 1' - 使用这个属性很好。但是,是的,它不应该是长度。将解决。 – 2010-08-18 15:08:42

0

临时收集应该是同一类型myQuestions。

我也建议在你的代码的变化:

for (int i = 0; i <= myQuestions.Count -1; i++) 


for (int i = 0; i < myQuestions.Count; i++) 

做同样的事情,但是这是最编程人员怎么做,所以它会使你的代码更简单的阅读。

2

您可以通过一个随机值使用Linq与秩序:

List<string> items = new List<string>(); 
items.Add("Foo"); 
items.Add("Bar"); 
items.Add("Baz"); 

foreach (string item in items.OrderBy(c => Guid.NewGuid())) 
{ 
    Console.WriteLine(item); 
}