从HashSet中获取随机元素<T>?

问题描述 投票:0回答:6

我正在使用以下代码将我的文本文件加载到

HashSet<string>
中。

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

我想知道是否有任何简单的方法可以从中获得随机线?

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

c# random hashset
6个回答
40
投票

无需每次都枚举整个数组,就可以得到像已接受的答案这样的简单答案:

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

...

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

17
投票
Random randomizer = new Random();
string[] asArray = hashs.ToArray()
string randomLine = asArray[randomizer.Next(asArray.length)];

3
投票

您可以生成一个介于 0 和集合大小之间的随机数,然后迭代集合,直到找到索引与生成的数字相同的项目。然后选择此项作为随机元素


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
投票

如果您计划绘制多个随机值,有效的方法是使用带有整数键的字典来存储信息。

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];

(在此示例中,您可以使用列表代替,但使用字典,您也可以删除单个元素而不影响顺序)。


-2
投票

自 .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));
© www.soinside.com 2019 - 2024. All rights reserved.