Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于ASP.NET的Linq Orderby随机线程安全_Asp.net_Asp.net Mvc_Linq_S#arp Architecture - Fatal编程技术网

用于ASP.NET的Linq Orderby随机线程安全

用于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

我正在使用Asp.NETMVC和Sharp架构

我有以下代码:

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的结果进行排序

优点:-

  • 高效:SQL处理 订购,无需取全套 桌子
  • 可重复:(适合 测试)-可以使用相同的随机变量 种子生成相同的随机变量 命令
  • 适用于支持的大多数(所有?)实体框架 数据库

  • 这是我的家庭自动化系统用来随机化播放列表的方法。它每天挑选一个新的种子,在一天中给出一致的顺序(允许轻松暂停/恢复功能),但在新的一天重新查看每个播放列表。

    你是说你希望整个列表随机化,然后检索前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);