代码之家  ›  专栏  ›  技术社区  ›  Paul Michaels

要使用哪种集合类型?

  •  1
  • Paul Michaels  · 技术社区  · 14 年前

    我有一个场景,我有一个类列表,我想把顺序弄混。例如:

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

    所以,考虑到现在已经填充了一组数据,我想混淆订单。我的第一个想法是创建一个从1到myquestions的整数集合。计数,随机分配一个给每个问题,然后按顺序循环它们;但是,我似乎找不到合适的集合类型用于此。我的意思是这样一个例子:

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

    但我不确定tempcollection应该是什么,它只需要一个单独的值,我可以在使用它时删除它。有人对使用哪种类型有什么建议,或者有更好的方法吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

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

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

    例如,您可以执行以下操作:

    // 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
  •  2
  •   Daniel Renshaw    14 年前

    您可以使用Linq和Order by a Random值:

    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);
    }
    
        3
  •  0
  •   EKS    14 年前

    临时集合应与MyQuestions类型相同。

    我还建议您更改代码:

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


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

    做同样的事情,但这是大多数编程人员的工作方式,这样可以使代码更容易阅读。