我有一个绑定到列表的ListView。列表视图实现自定义分页,其中仅返回页面上的结果数,当结果按字母顺序排列时,这非常有用。但是,我想尝试以随机顺序返回结果 - 该场景是一个销售办公室,团队成员显示在列表视图上。
我正在寻找一种允许自定义分页但保持结果随机化的算法。例如,按字母顺序排列,很简单 - .Take(Page# * ResultsOnPage)。但是,如果每次加载页面时都是随机的,那么个人可能会显示在多个页面上,有些则根本不会显示。
所以目标是:
这是否可能,或者我是否需要有一个逻辑维护的顺序才能成功实现自定义分页?
扩展 zmbq 的答案,您不需要创建一个类,您可以简单地用随机值填充一个新列表。以下内容来自这篇文章。
Random rnd = new Random();
var randomizedList = from item in list
orderby rnd.Next()
select item;
其实电脑里并没有“随机”这样的东西
如果您使用相同的种子值作为种子,随机函数将返回相同的一系列值。这就是随机数经常在当前时间播种的原因。如果将种子值保存到视图状态中,您应该能够一遍又一遍地重新生成相同的列表。如果你想生成新的随机顺序,只需重新生成种子即可。
这显然是可能的,问题是 - 最好的方法是什么。
我认为你应该随机排列你的列表,让其他一切照常进行。如果这是不可能的,您应该在列表前面放置一个随机发生器(我的术语,不要查找它......)。像这样的东西:
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,并让其他一切保持不变。