2011-06-09 202 views
1

如何隨機抽取一個列表並訂購它?ASP.net按順序隨機排列

List<Testimonial> testimonials = new List<Testimonial>(); 
testimonials.Add(new Testimonial {1}); 
testimonials.Add(new Testimonial {2}); 
testimonials.Add(new Testimonial {2}); 
testimonials.Add(new Testimonial {3}); 
testimonials.Add(new Testimonial {4}); 

我將如何使用

testimonials.OrderBy<> 

,以使其隨機的?

回答

7

這是解決方案。

public static List<T> RandomizeGenericList<T>(IList<T> originalList) 
{ 
    List<T> randomList = new List<T>(); 
    Random random = new Random(); 
    T value = default(T); 

    //now loop through all the values in the list 
    while (originalList.Count() > 0) 
    { 
     //pick a random item from th original list 
     var nextIndex = random.Next(0, originalList.Count()); 
     //get the value for that random index 
     value = originalList[nextIndex]; 
     //add item to the new randomized list 
     randomList.Add(value); 
     //remove value from original list (prevents 
     //getting duplicates 
     originalList.RemoveAt(nextIndex); 
    } 

    //return the randomized list 
    return randomList; 
} 

來源鏈接:http://www.dreamincode.net/code/snippet4233.htm

此方法將在C#中隨機任何泛型列表

+2

您應在此處包含解決方案的相關部分,並將鏈接作爲參考。 – ChrisF 2011-06-09 14:47:44

+0

這工作完美。沒有問題我將把它作爲幫手附加,以便我可以在我的項目中將其用於其他事情。 – brenjt 2011-06-09 15:01:58

+0

林間空地聽到:) – 2011-06-09 15:09:55

5
var random = new Random(unchecked((int) (DateTime.Now.Ticks)); 

var randomList = testimonials.OrderBy(t => random.Next(100)); 
+0

非常聰明.... – n8wrl 2011-06-09 14:45:55

+0

我可以問爲什麼你把它從testimonials.Lenth改爲100? – brenjt 2011-06-09 14:49:43

+0

@brenjt - 爲了使LINQ查詢不必持續評估testimonials.Length(取決於集合的類型,這可能會導致較差的性能)。 – 2011-06-09 15:00:46

1

賈斯汀Niessner的解決方案是簡單而有效的(和解決方案,我會給出),但它的NlogN複雜。如果性能是一個大問題,您可以使用Fischer-Yates-Durstenfeld混洗以線性時間對列表進行混洗。看看這個SO問題:An extension method on IEnumerable needed for shuffling