我有一个场景,我有一个类列表,我想混淆订单。例如:
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应该是什么 - 它只需要是我可以删除的单个值,因为我使用它。有没有人对使用哪种类型或更好的方法有任何建议?
答案 0 :(得分: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;
}
答案 1 :(得分: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);
}
答案 2 :(得分:0)
temp Collection应与myQuestions类型相同。
我还建议您更改代码:
for (int i = 0; i <= myQuestions.Count -1; i++)
要
for (int i = 0; i < myQuestions.Count; i++)
同样的事情,但这是大多数程序员这样做的,所以它会让你的代码更容易阅读。