Какой тип коллекции использовать? - PullRequest
1 голос
/ 16 августа 2010

У меня есть сценарий, в котором у меня есть список классов, и я хочу перепутать порядок.Например:

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 ]

3 голосов
/ 16 августа 2010

Я предлагаю вам скопировать результаты в новый List<Question> и затем перемешать этот список.

Однако я бы использовал Фишер-Йейтса 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;
}
2 голосов
/ 16 августа 2010

Вы можете использовать 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);
}
0 голосов
/ 16 августа 2010

temp Коллекция должна быть того же типа, что и myQuestions.

Я бы также предложил изменить ваш код:

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

до

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

Делает то же самое, но так делают большинство программистов, поэтому ваш код будет проще читать.

...