2012-02-27 110 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

實際上,沒有「隨機」這樣的東西與計算機。

如果使用相同的種子值對其進行種子處理,則隨機函數將返回相同的一系列值。這就是爲什麼隨機數經常在當前時間播種的原因。如果將種子值保存到視圖狀態中,則應該能夠一遍又一遍地重新生成相同的列表。如果你想產生一個新的隨機順序,只需重新生成種子。