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的实现.