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

本文关键字:自定义 分页 排序 随机 Net- | 更新日期: 2023-09-27 18:25:55

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

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

所以目标是:

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

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

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

扩展zmbq的答案,您不需要创建一个类,只需用随机化的值填充一个新列表即可。以下内容来自本帖。

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

事实上,计算机并没有"随机"这回事。

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

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

我认为你应该把你的清单随机化,让其他一切照常进行。如果这不可能,你应该在列表前面放一个随机化器(我的术语,不要查…)。类似这样的东西:

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

最简单的方法是:

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

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