2016-11-26 98 views
0

我有一个字符串列表,我想随机从这个列表中选择。当选择一个字符串时,必须从列表中删除。只有当所有的字符串被挑选出来后,列表中的才会重新填充。我如何实现这一目标?从没有替换的列表中选择一个随机字符串C#

+0

随机播放列表,然后逐个使用字符串。 –

回答

0

首先,制作一个随机数发生器。

Random rand = new Random(); 

然后,生成一个数字并从列表中删除该项目。我假设你正在使用System.Collections.Generic.List

int num = Random.Next(list.Count); 
list.RemoveAt(num); 
0

可以实现它非常简单:

public static partial class EnumerableExtensions { 
    public static IEnumerable<T> RandomItemNoReplacement<T>(this IEnumerable<T> source, 
     Random random) { 

     if (null == source) 
     throw new ArgumentNullException("source"); 
     else if (null == random) 
     throw new ArgumentNullException("random"); 

     List<T> buffer = new List<T>(source); 

     if (buffer.Count <= 0) 
     throw new ArgumentOutOfRangeException("source"); 

     List<T> urn = new List<T>(buffer.Count); 

     while (true) { 
     urn.AddRange(buffer); 

     while (urn.Any()) { 
      int index = random.Next(urn.Count); 

      yield return urn[index]; 

      urn.RemoveAt(index); 
     } 
     } 
    } 
    } 

,然后使用它:

private static Random gen = new Random();  

... 

var result = new List<string>() {"A", "B", "C", "D"} 
    .RandomItemNoReplacement(gen) 
    .Take(10); 

// D, C, B, A, C, A, B, D, A, C (seed == 123) 
Console.Write(string.Join(", ", result)); 
0

我想,你需要somethink喜欢隔壁班:

public class RandomlyPickedWord 
    { 
     public IList<string> SourceWords{ get; set; } 

     protected IList<string> Words{ get; set; } 

     public RandomlyPickedWord(IList<string> sourceWords) 
     { 
      SourceWords = sourceWords; 
     } 

     protected IList<string> RepopulateWords(IList<string> sources) 
     { 
      Random randomizer = new Random(); 
      IList<string> returnedValue; 
      returnedValue = new List<string>(); 

      for (int i = 0; i != sources.Count; i++) 
      { 
       returnedValue.Add (sources [randomizer.Next (sources.Count - 1)]); 
      } 

      return returnedValue; 
     } 

     public string GetPickedWord() 
     { 
      Random randomizer = new Random(); 
      int curIndex; 
      string returnedValue; 

      if ((Words == null) || (Words.Any() == false)) 
      { 
       Words = RepopulateWords (SourceWords); 
      } 

      curIndex = randomizer.Next (Words.Count); 
      returnedValue = Words [curIndex]; 
      Words.RemoveAt (curIndex); 

      return returnedValue; 
     } 
    } 

你应该用下一个方法:

IList<string> source = new List<string>(); 
      source.Add ("aaa"); 
      source.Add ("bbb"); 
      source.Add ("ccc"); 
      RandomlyPickedWord rndPickedWord = new RandomlyPickedWord (source); 

      for (int i = 0; i != 6; i++) 
      { 
       Console.WriteLine (rndPickedWord.GetPickedWord()); 
      } 
相关问题