2012-05-18 13 views
8

私のテキストファイルをハッシュセットにロードするには、次のコードを使用してください。ハッシュセットからランダムな要素を取得しますか?

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

ランダムな行を得る簡単な方法があるのですか?

私は、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.コピー/ペーストの回答を使うのではなく、学びます。 (私は今日、私の "ジャーク"の日の1つだと思います) – 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

関連する問題