List <t> </t>的随机副本

时间:2011-05-02 00:04:35

标签: c# list random

  

可能重复:
  Most efficient way to randomly “sort” (Shuffle) a list of integers in C#

如何有效地创建List<T>的随机副本?

List<string> myList = new List<string>();
myList.Add("A");
myList.Add("B");
myList.Add("C");

// Now an extension method or a function which returns a random arrangement of myList:

List<string> GetRandomList()
{
    // List<string> result = new List<string>();
    // Random rnd = new Random();
    // Inside a loop
    // result.Add(myList[rnd.Next(1, myList.Count)]);
}

扩展方法应为public static List<T> Shuffle(List<T> this)

2 个答案:

答案 0 :(得分:4)

你正在寻找一个Shuffle,那里有各种各样的实现,通常是Fisher-Yates shuffle

以下从here获取的通用实现:

public static void Shuffle<T>(this IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

请注意,这会将列表重新排序,如果您想要这样做,很容易重构它以返回新列表。

答案 1 :(得分:0)

public List<T> Random<T>(this IEnumerable<T> collection)
{
    return collection.OrderBy(i => Guid.NewGuid()).ToList();
}

感谢Jeff Atwood for this solution