使用哪种集合类型?

时间:2010-08-16 15:29:13

标签: c# .net-3.5 collections

我有一个场景,我有一个类列表,我想混淆订单。例如:

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 个答案:

答案 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++)  

同样的事情,但这是大多数程序员这样做的,所以它会让你的代码更容易阅读。