2012-05-21 20 views
1

排序列表,我必須做出包含對象的列表。對象需要隨機排列。 在這裏,我給他們隨機數:在LINQ

Random tal = new Random(); 
list1[i].nummer = tal.Next(list1.Count); 
listGold.Add(list1[i]); 

,現在我只需要通過數字進行排序。 我認爲linq可以爲我做。但它不能:■

我想這一點:

RepeaterSponsorGold.DataSource = listGold.OrderBy(n => n.nummer); 
RepeaterSponsorGold.DataBind(); 

訂購由nummer我的名單,並把名單到我repater。但lsit似乎沒有被排序......或者似乎沒有隨機數字。我不知道哪個。 任何人都可以看到我在做什麼錯?

+2

排序方式隨機可以有一個奇怪的分佈。您應該使用http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle –

+3

是否在您用來設置隨機數的循環內創建「new Random()」?你應該磺酰基創建一個新的隨機()一次,然後使用該實例從那時起,否則你很可能會走出反覆得到相同的隨機數。 – Chris

+0

步驟通過您的代碼,並確保你的隨機數的設置是否正確。 – jrummell

回答

3

嘗試

RepeaterSponsorGold.DataSource = listGold.OrderBy(n => n.nummer).ToList(); 
+3

'ToList()'如何幫助排序? – jrummell

+0

它有助於數據綁定。 –

+2

ToList()如何幫助綁定? – jrummell

2

如果您需要以隨機順序進行排序,你可以嘗試:

var listGold = list1.OrderBy(n => Guid.NewGuid()); 

,而不需要使用Random

+2

如果性能是一個問題,這不是一個好的解決方案。排序是O(n * log(n))操作。混洗只需要O(n)。 '洗牌算法'鏈接顯示了一個更好的方法。 –

+0

這也不是一個很好的解決方案,如果隨機性是一個問題! Guids被設計成獨一無二的,它們不一定是隨機的。 – LukeH

2

您should't使用隨機()洗牌的列表,因爲它可以產生determanistic分佈。

相反,使用suffle:

Randomize a List<T>

public static void Shuffle<T>(this IList<T> list) 
{ 
    Random rng = new Random(); 
    int n = list.Count; 
    while (n > 1) { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 
} 

.... 

listGold.Shuffle(); 
+0

你應該將Random傳遞給方法,所以你的程序只使用一個Random。 –

+0

爲什麼你的upvotes,誰知道 - OP的問題不是如何隨機化列表,而是如何排序。 –

+1

@Chuck:「我必須創建一個包含對象的列表,並且對象需要以隨機順序。」是非常明確的。 – Rawling

0

如何:

List<string> list = new List<string>() 
         { 
          "Blue", 
          "Brown", 
          "Beige", 
          "Red", 
          "Black" 
         }; 
Random random = new Random(); 
var orderedList = list.Select(c => new {Item = c, Order = random.Next()}) 
    .OrderBy(i=>i.Item) 
    .Select(x=>x.Item).ToList(); 

orderedList.ForEach(x=>Console.WriteLine(x)); 
0

你有幾個問題。

最重要的是,你應該只有一個Random的實例,並重復使用它,而不是每次都調用一個新實例。

其次,通過使用列表算作你的種子,你會得到一個大致順序列表。

list1[i].nummer = tal.Next(list1.Count); 

因爲您使用list.Count作爲種子,您將得到一個大致按照它們的添加順序排列的列表。

而是嘗試:

Enumerable.Range(0,100) 
    .ToDictionary(k=> Guid.NewGuid()) 
    .OrderBy(o => o.Key).Select(s => s.Value).ToList() 

使用的GUID會給你比隨機更自然的隨機化。