11

次のコードを使用して、テキストファイルをハッシュセットにロードします。

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

そこからランダムな線を取得する簡単な方法があるかどうか疑問に思っていますか?

textFile.txtに10行が含まれていると仮定して、それらの既存の行の1つをランダム化して取得したいと思います。

4

6 に答える 6

37

毎回配列全体を列挙しなくても、受け入れられているような単純な答えが可能です。

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

...

T element = hashset.ElementAt(random.Next(hashset.Count));
于 2013-04-11T22:34:58.043 に答える
15
Random randomizer = new Random();
string[] asArray = hashs.ToArray()
string randomLine = asArray[randomizer.Next(asArray.length)];
于 2012-05-18T14:31:15.407 に答える
3

0 からセットのサイズまでの乱数を生成し、生成された数と同じインデックスを持つアイテムに到達するまで、セットアップを繰り返します。次に、このアイテムをランダム要素として選択します

于 2012-05-18T14:24:07.357 に答える
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); 
    }
}
于 2012-05-18T14:25:08.217 に答える