我使用以下代码将我的文本文件加载到 hashset 。
HashSet<string> hashs = new HashSet<string>(File.ReadLines("textFile.txt"));
我想知道是否有任何简单的方法从中获取随机线?
假设textFile.txt包含10行,我想随机化并抓住其中一条现有行。
答案 0 :(得分:31)
一个简单的答案就像被接受的答案一样,每次都不需要枚举整个数组:
private static readonly Random random = new Random();
private static readonly HashSet<T> hashset = new HashSet<T>();
...
T element = hashset.ElementAt(random.Next(hashset.Count));
答案 1 :(得分:11)
Random randomizer = new Random();
string[] asArray = hashs.ToArray()
string randomLine = asArray[randomizer.Next(asArray.length)];
答案 2 :(得分:3)
您可以生成介于0和集合大小之间的随机数,然后遍历设置,直到您到达索引与生成的数字相同的项目。然后选择此项作为随机元素
答案 3 :(得分: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);
}
}
答案 4 :(得分:0)
自.Net Framework 3.5开始,您可以将Linq及其Enumerable.First()
扩展方法使用。
不指定任何条件作为参数,此方法将返回
序列的第一个元素。
您应该考虑使用Enumerable.First()
要求您的HashSet<>
至少包含一个元素。
要检查此前提条件,可以再次使用HashSet<>.Count
或通过Linq与Enumerable.Any()
一起使用,而无需指定条件。
HashSet<T> hashSet = new HashSet<T>();
...
if(hashSet.Any())
{
T randomElement = hashSet.First()
}
作为上述方法的替代方法,如果您想在HashSet<T>
为空的情况下检索任何默认值,则可以使用Enumerable.FirstOrDefault()
。
T randomElement = hashSet.FirstOrDefault(default(T));
答案 5 :(得分:0)
如果您打算绘制多个随机值,有效的方法是使用带有整数键的字典来存储信息。
HashSet<string> hashs = new HashSet<string>();
Dictionary<int, string> lookup = new Dictionary<int, string>();
foreach (string line in File.ReadLines("textFile.txt")) {
if (hashs.Add(line)) {
lookup.Add(lookup.Count, line);
}
}
int randomInt = new Random().Next(lookup.Count);
string randomLine = lookup[randomInt];
(在本例中,您可以使用 List 来代替,但使用字典您也可以在不影响顺序的情况下删除单个元素)。