2011-01-26 22 views
6

Chcę napisać program C#, który wykonuje kilka metod A(), B() i C() w losowej kolejności. Jak mogę to zrobić?Wywołanie metod w kolejności losowej (C#)

+2

Gjorgji idea GUID jest straszna. Przynajmniej zamów przez Random - lub lepiej, użyj algorytmu, który jest najczęściej wybierany. Odczytaj te głosy - społeczność mówi ci, która z nich jest lepsza. –

+0

bardzo straszny pomysł, dlatego nie znajdziesz niczego na google, jeśli go znajdziesz http://www.google.com/search?q=orderby+%22Guid.NewGuid%22 –

+3

@Pauli, twoje przekonanie jest wszystko, co znajdziesz w Google, jest automatycznie dobrym pomysłem? –

Odpowiedz

14

Zakładając generator liczb losowych deklarowaną tak:

public static Random Rnd = new Random(); 

Zdefiniujmy Shuffle funkcję przynieść listę w kolejności losowej:

/// <summary> 
/// Brings the elements of the given list into a random order 
/// </summary> 
/// <typeparam name="T">Type of elements in the list.</typeparam> 
/// <param name="list">List to shuffle.</param> 
/// <returns>The list operated on.</returns> 
public static IList<T> Shuffle<T>(this IList<T> list) 
{ 
    if (list == null) 
     throw new ArgumentNullException("list"); 
    for (int j = list.Count; j >= 1; j--) 
    { 
     int item = Rnd.Next(0, j); 
     if (item < j - 1) 
     { 
      var t = list[item]; 
      list[item] = list[j - 1]; 
      list[j - 1] = t; 
     } 
    } 
    return list; 
} 

Ten Shuffle realizacja dzięki uprzejmości romkyns!

Teraz wystarczy umieścić metod w wykazie, shuffle, następnie uruchomić je:

var list = new List<Action> { A, B, C }; 
list.Shuffle(); 
list.ForEach(method => method()); 
+0

Najprostszym sposobem na przetasowanie w Linq jest użycie * OrderBy (m => Guid.NewGuid()) * –

+4

+1 dla prawdziwego shuffle. – SLaks

+3

@Pauli: Zawsze łatwiej jest napisać program, który czasami wyprowadza śmieci niż ten, który działa niezawodnie. – Timwi

Powiązane problemy