从集合中随机返回项目

Ed.*_*Ed. 3 c# generics random filtering random-sample

我有一个从数据库返回通用列表集合(List)的方法.此系列包含订单详细信息,即订单ID,订单名称,产品详细信息等.

此外,该方法返回一个集合,该集合仅包含按订单日期降序排序的前5个订单.

我的要求是每次客户端调用此方法时,我需要返回有5个随机命令的集合.

我如何使用C#实现这一目标?

Gre*_*ech 12

我一段时间后写了一个TakeRandom扩展方法,它使用Fisher-Yates shuffle来完成.这是非常有效的,因为它只是让您实际想要返回的项目数量随机化,并保证是无偏见的.

public static IEnumerable<T> TakeRandom<T>(this IEnumerable<T> source, int count)
{
    var array = source.ToArray();
    return ShuffleInternal(array, Math.Min(count, array.Length)).Take(count);
}

private static IEnumerable<T> ShuffleInternal<T>(T[] array, int count)
{
    for (var n = 0; n < count; n++)
    {
        var k = ThreadSafeRandom.Next(n, array.Length);
        var temp = array[n];
        array[n] = array[k];
        array[k] = temp;
    }

    return array;
}
Run Code Online (Sandbox Code Playgroud)

可以在PFX团队博客中找到 ThreadSafeRandom的实现.

  • 虽然它似乎确实在复制列表(效率?)或修改现有列表(从签名中不容易看出). (2认同)