代码之家  ›  专栏  ›  技术社区  ›  janhartmann

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

  •  1
  • janhartmann  · 技术社区  · 14 年前

    如何随机化我得到的文件的顺序:

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

    谢谢您!-)

    4 回复  |  直到 9 年前
        1
  •  5
  •   Kobi    14 年前

    一种选择是使用 Random :

    Random rng = new Random();
    

    然后:

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

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

        2
  •  2
  •   Hans Olsson    14 年前

    如果不能使用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;
            }
        }
    }
    
        3
  •  2
  •   Community CDub    7 年前

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

    创建助手/扩展方法 perform an in-place shuffle 在从返回的数组上 GetFiles :

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

    如果您希望返回一个新序列la linq,您可以创建一个合适的 Shuffle extension method 而是:

    // uses Shuffle extension from https://stackoverflow.com/a/1653204/55847
    var sequenceOfFiles = Directory.EnumerateFiles("folder").Shuffle();
    
        4
  •  0
  •   Rob    14 年前
    1. 循环访问源列表。
    2. 从源列表中删除随机源项
    3. 将删除的项附加到结果列表
    4. 重复,直到源列表为空
    <> <代码> >

    list<string>files=directory.getfiles(“folder”);
    list<string>result=新列表<string>();
    
    while(文件.count>0)
    {
    int n=integerutility.random(files.count);
    字符串文件=files.remove(n);
    结果.添加(文件);
    }
    返回结果;
    < /代码> 
    
    

    在源列表上重复。

  • 从源列表中删除随机源项
  • 将删除的项附加到结果列表
  • 重复,直到源列表为空
  • 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;