随机化文件夹中输出的文件

时间:2010-05-25 09:25:22

标签: c# asp.net random

如何随机化我获取的文件的顺序:

string[] files = Directory.GetFiles("folder");

谢谢! : - )

4 个答案:

答案 0 :(得分:5)

一种选择是使用Random

Random rng = new Random();

然后:

var randomOrderFiles = files.OrderBy(f => rng.Next());

这不是最有效的方法,因为它需要O(nlogn)。如果这对您来说是个问题,则存在更好的算法。

答案 1 :(得分:2)

如果您不能使用Linq,则以下方法应该有效:

static Random rand = new Random();
static void Randomize<T>(IList<T> list)
{
    for (int i = list.Count - 1; i > 0; i--)
    {
        int i2 = rand.Next(i + 1);
        if (i2 != i)
        {
            T tmp = list[i2];
            list[i2] = list[i];
            list[i] = tmp;
        }
    }
}

答案 2 :(得分:2)

A Fisher-Yates-Durstenfeld shuffle是O(n),应该给出无偏分布。

GetFiles返回的数组上为perform an in-place shuffle创建一个帮助/扩展方法:

// uses ShuffleInPlace extension from https://stackoverflow.com/a/5589250/55847
var arrayOfFiles = Directory.GetFiles("folder");
arrayOfFiles.ShuffleInPlace();

如果您希望返回一个新序列 - 例如LINQ - 您可以改为创建一个合适的Shuffle extension method

// uses Shuffle extension from https://stackoverflow.com/a/1653204/55847
var sequenceOfFiles = Directory.EnumerateFiles("folder").Shuffle();

答案 3 :(得分:0)

  1. 迭代源列表。
  2. 从源列表中删除随机源项目
  3. 将已删除的项目附加到结果列表
  4. 重复直到源列表为空
  5. List<string> files = Directory.GetFiles("folder");
    List<string> result = new List<string>();
    
    while (files.Count > 0)
    {
      int n = IntegerUtility.Random(files.Count);
      string file = files.Remove(n);
      result.Add(file);
    } 
    return result;
    

    List<string> files = Directory.GetFiles("folder"); List<string> result = new List<string>(); while (files.Count > 0) { int n = IntegerUtility.Random(files.Count); string file = files.Remove(n); result.Add(file); } return result;