.Net - 随机排序的自定义分页

时间:2012-02-27 21:35:43

标签: c# .net linq paging

我有一个ListView绑定到List。 listview实现了自定义分页,其中只返回页面上的结果数,这在结果按字母顺序排列时效果很好。但是,我想尝试以随机顺序返回结果 - 该场景是一个销售办公室,其中团队成员显示在列表视图上。

我正在寻找一种允许自定义分页但保持结果随机化的算法。例如,按字母顺序,它很简单 - .Take(Page#* ResultsOnPage)。但是,如果每次加载页面时它都是随机的,那么个人可以在多个页面上显示,而一些人根本不显示。

所以目标是:

  • 随机列表
  • 从列表
  • 获取给定页面的结果
  • 根据需要获取相同随机列表的下一页。

这是否可行,或者我是否需要具有逻辑维护的顺序才能成功实现自定义分页?

4 个答案:

答案 0 :(得分:2)

扩展zmbq的答案,你不需要创建一个类,你可以简单地用随机值填充一个新的列表。以下内容来自this post

Random rnd = new Random();
var randomizedList = from item in list
                     orderby rnd.Next()
                     select item;

答案 1 :(得分:2)

实际上,计算机没有“随机”这样的东西。

如果使用相同的种子值对Random函数进行种子处理,则Random函数将返回相同的值序列。这就是为什么随机数经常在当前时间播种的原因。如果将种子值保存到视图状态,则应该能够一遍又一遍地重新生成相同的列表。如果要生成新的随机顺序,只需重新生成种子。

答案 2 :(得分:1)

显然可能,问题是 - 做这件事的最佳方式是什么。

我认为你应该随机化你的清单,让其他一切照常工作。如果那是不可能的,你应该在列表前放置一个Randomizer(我的术语,不要查找......)。像这样:

class Randomizer<T> : IList<T>
{
    private IList<T> _underlyingList;
    private List<int> _permutation;

    public Randomizer(IList<t> underlying)
    {
        _underlyingList = underlying;
        _permutation = GenerateRandomPermutation(_underlyingList.Count);
    }

    // Implement the IList interface, for example
    public T this[int index] { get { return _underlyingList[_permutation[value]]; } }
}

您可能希望实现ICollection,因为它可以为您节省一些精力。

无论如何,将ListView连接到Randomizer而不是List,并让其他所有内容保持不变。

答案 3 :(得分:1)

最简单的方法是:

  • 随机化整个数据集。
  • 然后,在页面中对其进行分区,您可以看到here将列表分区为较小列表的方法。

当你不再需要时,你需要一种摆脱列表清单的方法。