2012-02-27 78 views
1

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

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

所以我们的目标是:

  • 随机排列
  • 采取指定网页的结果从列表
  • 相同的随机列表的下一个页面需要获取。

这甚至可能呢,还是需要有一个逻辑上维持为了成功实现自定义分页?

回答

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,并让其他所有内容保持不变。

1

最简单的方法是:

  • 随机化你的整个数据集。
  • 然后,在页面中进行分区,你可以看到here一种将列表分割成小列表的方式。

您需要一种方法来摆脱不再需要的列表清单。

2

在zmbq的答案上进行扩展,您不需要创建类,只需使用随机值填充新列表即可。以下是从this post

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

嗯,是的,这比我的建议更简单。如果T是值类型,并且在应用程序运行时修改了T,我的建议只会更好。那么,我的建议在其中有'permutation'这个词,所以它在*方面更好:aspect :-) – zmbq 2012-02-27 22:21:53

+0

@zmbq:价值类型的优点,没有想到这一点。 – Guvante 2012-02-27 22:27:37

+0

我认为在OP的情况下,赔率很低。 – zmbq 2012-02-27 22:31:39

2

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

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