2010-08-16 90 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); 
}