2012-05-18 45 views
8

即时通讯使用以下代码片段将我的文本文件加载到哈希集从hashset获取随机元素?

HashSet<string> hashs = new HashSet<string>(File.ReadLines("textFile.txt")); 

我想知道是否有任何简单的方法从它得到一个随机线?

让asume textFile.txt包含10行,我想随机化并抓取其中一行。

+1

你有什么试过?您是否尝试过使用System.Random类生成一个介于0和<# of lines>之间的随机数,然后通过索引引用该项?这些都是MSDN库中已经记录的所有任务。 http://mattgemmell.com/2008/12/08/what-have-you-tried/ – David

回答

10
Random randomizer = new Random(); 
string[] asArray = hashs.ToArray() 
string randomLine = asArray[randomizer.Next(asArray.length)]; 
+0

完美的作品!谢谢你 – user1213488

+3

明智的低效表现。不是我知道更好的方法,而是说。 – batman

2

您可以生成一个介于0和该集合大小之间的随机数,然后遍历该设置,直到您到达其索引与生成的数字相同的项目。然后选择这个项目作为随机元

+0

这个代码看起来怎么样?不知道该怎么写:) – user1213488

+0

1. Google“System.Random”。 2.查看已提供的文档和代码示例,可在整个Web上使用。 3.学习,而不是使用复制/粘贴答案。 (我想今天是我的“混蛋”日子之一。) – David

1

或者,也许任何枚举

public static class RandomExtensions 
{ 
    private static readonly Random rnd = new Random(); 
    private static readonly object sync = new object(); 

    public static T RandomElement<T>(this IEnumerable<T> enumerable) { 
     if (enumerable == null) 
      throw new ArgumentNullException("enumerable"); 

     var count = enumerable.Count(); 

     var ndx = 0; 
     lock (sync) 
      ndx = rnd.Next(count); // returns non-negative number less than max 

     return enumerable.ElementAt(ndx); 
    } 
} 
+0

'ElementAt'将为空集合抛出异常。 –

+2

@lazyberezovsky如果ElementAt抛出,则应该比RandomElement抛出相同的异常。应该有一个RandomElementOrDefault在这种情况下 – Vasea

24

像接受一个简单的答案是可以不用每次都列举了整个阵列更通用的解决方案:

private static readonly Random  random = new Random(); 
private static readonly HashSet<T> hashset = new HashSet<T>(); 

... 

T element = hashset.ElementAt(random.Next(hashset.Count)); 
+6

ElementAt仍然枚举元素直到达到指定索引,所以它不会更快。 – Zonko