.Net-具有随机排序的自定义分页
本文关键字:自定义 分页 排序 随机 Net- | 更新日期: 2023-09-27 18:25:55
我有一个绑定到List的ListView。listview实现了自定义分页,其中只返回页面上的结果数,当结果按字母顺序排列时,这种方法非常有效。然而,我想尝试以随机顺序返回结果——场景是一个销售办公室,团队成员显示在列表视图上。
我正在寻找一种算法,它将允许自定义分页,但保持对结果的随机化。例如,按字母顺序,它很简单——.Take(Page#*ResultsOnPage)。然而,如果每次加载页面时都是随机的,那么个人可能会显示在多个页面上,而有些页面根本没有显示。
所以目标是:
- 随机化列表
- 从列表中获取给定页面的结果
- 根据需要获取相同随机化列表的下一页
这是否可能,或者我是否需要有一个逻辑维护的顺序来成功实现自定义分页?
扩展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,并让其他一切保持不变。
最简单的方法是:
- 将整个数据集随机化
- 然后,将其划分为页面,您可以在这里看到一种将列表划分为较小列表的方法
当不再需要的时候,你需要一种方法来摆脱你的列表。