用于ASP.NET的Linq Orderby随机线程安全
我正在使用Asp.NETMVC和Sharp架构 我有以下代码:用于ASP.NET的Linq Orderby随机线程安全,asp.net,asp.net-mvc,linq,s#arp-architecture,Asp.net,Asp.net Mvc,Linq,S#arp Architecture,我正在使用Asp.NETMVC和Sharp架构 我有以下代码: return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory) .Take(50).ToList(); 我怎样才能随机订购? 注意:我不想订购50个提取的项目,我想先订购,然后再提取50个项目 thks最好编写自己的扩展方法来实现 public static class Extensions { static re
return _repositoryKeyWord.FindAll(x => x.Category.Id == idCAtegory)
.Take(50).ToList();
我怎样才能随机订购?
注意:我不想订购50个提取的项目,我想先订购,然后再提取50个项目
thks最好编写自己的扩展方法来实现
public static class Extensions
{
static readonly Random random = new Random();
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items)
{
return Shuffle(items, random);
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> items, Random random)
{
// Un-optimized algorithm taken from
// http://en.wikipedia.org/wiki/Knuth_shuffle#The_modern_algorithm
List<T> list = new List<T>(items);
for (int i = list.Count - 1; i >= 1; i--)
{
int j = random.Next(0, i);
T temp = list[i];
list[i] = list[j];
list[j] = temp;
}
return list;
}
}
公共静态类扩展
{
静态只读随机=新随机();
公共静态IEnumerable Shuffle(此IEnumerable项)
{
返回洗牌(项目,随机);
}
公共静态IEnumerable Shuffle(此IEnumerable项,随机)
{
//未优化算法取自
// http://en.wikipedia.org/wiki/Knuth_shuffle#The_modern_algorithm
列表=新列表(项目);
对于(int i=list.Count-1;i>=1;i--)
{
int j=随机。下一个(0,i);
T temp=列表[i];
列表[i]=列表[j];
列表[j]=温度;
}
退货清单;
}
}
您可以按说明在T-Sql中执行此操作。我认为在linq中,如果不将整个结果集加载到内存中,然后扔掉大部分结果集(这是您不想做的),就无法做到这一点。高效实现的一种方法是在数据中添加一列Shuffle
,该列使用随机int填充(在创建每个记录时)
访问该表的查询将变为
Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);
这在数据库中执行XOR操作,并根据XOR的结果进行排序
优点:-
这是我的家庭自动化系统用来随机化播放列表的方法。它每天挑选一个新的种子,在一天中给出一致的顺序(允许轻松暂停/恢复功能),但在新的一天重新查看每个播放列表。你是说你希望整个列表随机化,然后检索前50个项目吗?这个问题与链接的问题不重复。此问题具体表示ASP.NET,它需要线程安全随机访问。链接的问题没有提到线程安全哈,我喜欢这样。如果它使用快速排序,那么可能会崩溃。我知道尝试在不一致的参数上使用Array.Sort会导致异常。我想看看生成的sql。是返回整个表,然后排序并丢弃除前50条记录以外的所有记录吗?啊,是的,应该是这样。Take(50)。OrderBy(x=>r.Next()),而不是相反。编辑:没关系,我误读了这个问题。@Rei Miyasaka:为什么,他明确表示他不想只对50项进行排序?反转它们的SQL是否根据规范正确生成?这个解决方案让我走了OOOO和ahhhh.jfar:我也是;'真讨厌。虽然我只是使用了PK(一个int)而不是Shuffle字段,但是效果很好。谢谢Hightechrider!这真是太棒了!我也用过PK。性能是杰出的随机。Next不是线程安全的,所以您不能在这里使用静态变量来存储共享的随机值。当然,这里必须有i-,而不是i++
Random random = new Random();
int seed = random.Next();
result = result.OrderBy(s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);