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

问题描述 投票:0回答:4

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

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

所以目标是:

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

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

c# .net linq pagination
4个回答
2
投票

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

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

2
投票

其实电脑里并没有“随机”这样的东西

如果您使用相同的种子值作为种子,随机函数将返回相同的一系列值。这就是随机数经常在当前时间播种的原因。如果将种子值保存到视图状态中,您应该能够一遍又一遍地重新生成相同的列表。如果你想生成新的随机顺序,只需重新生成种子即可。


1
投票

这显然是可能的,问题是 - 最好的方法是什么。

我认为你应该随机排列你的列表,让其他一切照常进行。如果这是不可能的,您应该在列表前面放置一个随机发生器(我的术语,不要查找它......)。像这样的东西:

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,并让其他一切保持不变。


1
投票

最简单的方法是:

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

您需要一种方法来在不再需要时删除列表列表。

© www.soinside.com 2019 - 2024. All rights reserved.