我正在使用下面这段代码将我的文本文件加载到一个哈希集合中。
HashSet<string> hashs = new HashSet<string>(File.ReadLines("textFile.txt"));
请问有没有一种简单的方法可以从文本文件中获取随机一行呢?
假设textFile.txt包含10行,我想要随机选取其中一行。
我正在使用下面这段代码将我的文本文件加载到一个哈希集合中。
HashSet<string> hashs = new HashSet<string>(File.ReadLines("textFile.txt"));
请问有没有一种简单的方法可以从文本文件中获取随机一行呢?
假设textFile.txt包含10行,我想要随机选取其中一行。
可以通过简单回答来避免每次枚举整个数组:
private static readonly Random random = new Random();
private static readonly HashSet<T> hashset = new HashSet<T>();
...
T element = hashset.ElementAt(random.Next(hashset.Count));
Random randomizer = new Random();
string[] asArray = hashs.ToArray()
string randomLine = asArray[randomizer.Next(asArray.length)];
您可以生成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];
或许更适用于任何可枚举的一般解决方案
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);
}
}
ElementAt
会针对空集合抛出异常。 - Sergey Berezovskiy自从 .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()
}
除了上述方法,您还可以使用 Enumerable.FirstOrDefault()
作为替代方案,以便在 HashSet<T>
为空时检索任何默认值。
T randomElement = hashSet.FirstOrDefault(default(T));