2011-04-07 16 views
0

我已经到处寻找如何在C#中为Windows Phone 7打乱/随机化一个字符串列表。我仍然是一个初学者,你可以这样说,所以这可能是我的出路联盟,但我正在写一个简单的应用程序,这是它的基础。我有我需要洗牌并输出到文本块的字符串列表。我查阅了一些代码,但我知道我错了。有什么建议么?C#中的字符串清单在Windows Phone 7

+1

HTTP: //stackoverflow.com/search?q=%5Bc%23%5D+shuffle – dtb 2011-04-07 23:21:44

+0

如果你不需要随机混排,一个简单的选择是返回“strings.OrderBy(s => s.GetHashCode() );” ;) – 2011-04-07 23:43:01

+0

可能重复的[C#:是使用随机和OrderBy一个很好的洗牌算法?](http://stackoverflow.com/questions/1287567/c-is-using-random-and-orderby-a-good-shuffle -algorithm) – Jon 2011-04-08 00:49:16

回答

3

Fisher-Yates-Durstenfeld shuffle是一种易于实施的成熟技术。这是一个扩展方法,可以在任何IList<T>上执行就地洗牌。

(这应该很容易,如果你决定要离开原来的清单完整,并返回一个新的洗牌列表,而不是,或act on IEnumerable<T> sequences,点菜LINQ适应。)

var list = new List<string> { "the", "quick", "brown", "fox" }; 
list.ShuffleInPlace(); 

// ... 

public static class ListExtensions 
{ 
    public static void ShuffleInPlace<T>(this IList<T> source) 
    { 
     source.ShuffleInPlace(new Random()); 
    } 

    public static void ShuffleInPlace<T>(this IList<T> source, Random rng) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (rng == null) throw new ArgumentNullException("rng"); 

     for (int i = 0; i < source.Count - 1; i++) 
     { 
      int j = rng.Next(i, source.Count); 

      T temp = source[j]; 
      source[j] = source[i]; 
      source[i] = temp; 
     } 
    } 
} 
+0

现在你将如何设置一个随机字符串从列表到文本块? – Christian 2011-04-08 02:07:23

+1

如果你只需要一个随机字符串,那么你可能根本不需要随便洗牌;只需从现有列表中选择一个随机字符串:var rng = new Random(); yourTextBlock.Text = yourStringList [rng.Next(yourStringList.Length)];' – LukeH 2011-04-08 09:01:40