2017-04-11 18 views
1

約200個の行(行)のテキストファイルから(n個)のランダムな行を読み込み、 "recSongs"というリストボックスを作成しようとしています。私は、テキストファイルから1つのランダムな行を取得するいくつかの単純なコードを提供していますが、私はn個の量を取得したい。c#txtファイルから 'n'個のランダムな行を読む

ここに私のコードです。

var lines = File.ReadAllLines(@"file.txt"); 
var r = new Random(); 
var randomLineNumber = r.Next(0, lines.Length - 1); 
var line = lines[randomLineNumber]; 
recSongs.Items.Add(line); 
+0

を回避し、最後の行が原因二番目のパラメータに選択されることはないだろうが包括的ではありません。 – dcg

+0

同じ行をランダムに2回ランダムに表示しないでください。 – Tee

答えて

0
var lines = File.ReadAllLines(@"file.txt"); 
var r = new Random(); 

var randomized = lines.OrderBy(item => r.Next()); //randomize the list 
recSongs.Items.AddRange(randomized.Take(N).ToArray()); //Add N amount to listbox 

このソリューションはまた、重複randoms

1

nは、入力されますつまり、線なしのあなたは

List <string> text = File.ReadLines("file.txt").Take(n).ToList(); 

を必要とする編集

あなたはランダムなラインが必要な場合は、行うことができ、

 string[] lines = File.ReadAllLines(@"C:\YourFile.txt"); 
     List<string> source = new List<string>(); 
     int n = 10; 
     for (int i = 0; i < n; i++) 
     { 
      source.Add(lines[new Random().Next(lines.Length)]); 
     } 
+1

彼は 'n '個のランダムな行を得たいと思っています。そこでは最初の 'n'行を取っています。 – dcg

+0

@dcg yes corrected – Sajeetharan

+0

ランダムなインスタンスを使用すると、ランダムなインスタンスを使用することで、ランダムにインスタンスを作成することができます。 – slimbofat

0

これにより、あなたのコレクションにランダムな行番号numLinesが追加されます。重複がある可能性があることに注意してください。

var lines = File.ReadAllLines(@"file.txt"); 
var r = new Random(); 
int numLines = 5; 

for (int i = 0; i < numLines; i++) 
{ 
    recSongs.Items.Add(lines[r.Next(0, lines.Length - 1)]); 
} 

ユニークなアイテムを強制するために、あなたはこのような何か行うことができます:

for (int i = 0; i < numLines; i++) 
{ 
    var randomItem = string.Empty; 

    do 
    { 
     randomItem = lines[r.Next(0, lines.Length - 1)]; 

    } while (recSongs.Contains(randomItem)); 

    recSongs.Items.Add(randomItem); 
} 

をしかし、今、終了しないことも可能であることに注意してください。ランダムの喜び!

+0

原則として、同じ行を何度か追加しています。 – dcg

+0

ええ、私はあなたがコメントを入力していたときに答えを更新していました!しかし、 'OrderBy(x => Guid.NewGuid())。Take(n)'答えは最高です –

+0

私はあなたと同意し、その答えは受け入れられるべきです。 – dcg

0

おそらく最も簡単な方法は、最もメモリ効率ではないが、Shuffle()ラインそして、そのラインのインメモリコレクションにファイルを読まし、必要しかし、多くを取ることです。

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> input) 
    { 
     var buffer = input.ToArray(); 
     //Math.Random is OK for "everyday" randomness; 
     //use RNGCryptoServiceProvider if you need 
     //cryptographically-strong randomness 
     var rand = new Random(); 

     //As the loop proceeds, the element to output will be randomly chosen 
     //from the elements at index i or above, which will then be swapped 
     //with i to get it out of the way; the yield return gives us each 
     //shuffled value as it is chosen, and allows the shuffling to be lazy. 
     for (int i = 0; i < buffer.Length; i++) 
     { 
      int j = rand.Next(i, buffer.Length); 
      yield return buffer[j]; 
      //if we cared about the elements in the buffer this would be a swap, 
      //but we don't, so...  
      buffer[j] = buffer[i]; 
     } 
    } 

    ... 

    string[] fileLines = GetLinesFromFile(fileName); //a StreamReader makes this pretty easy 
    var randomLines = fileLines.Shuffle().Take(n); 

いくつかのノート:

  • これは、約200行のテキストファイルではかなりうまくいくはずです。数十万行を超えると、あなたは記憶上の問題を抱えるでしょう。よりスケーラブルな解決策は、行番号の配列をシャッフルし、それらを使って必要な特定の行を探して読み込み、他の行をすべて破棄することです。
  • このソリューションはランダムな順序でランダムな線を生成します。ファイルから行の順序を保持したい場合は、行番号の変形を行い、選択した行番号をソートしてから、ファイルから読み込んだ後にその行をそのまま保ちます。
0

あなたが好きな何かができる

var lines = File.ReadAllLines(@"file.txt"); 
var r = new Random(); 
int noLines = 10;// n lines 

for (int i = 0; i < noLines; i++) 
{ 
    var randomLineNumber = r.Next(0, lines.Length - 1); 
    var line = lines[randomLineNumber]; 
    recSongs.Items.Add(line); 
} 
0

これは試してみてください:取得する行の量は、行の実際の数よりも大きい場合

HashSet<int> linesHash = new HashSet<int>(); 
var lines = file.ReadLines(); 
for (int i = 0; i < numLinesToGet; i++) 
{ 
    int line=0; 
    do 
    { 
     line = rand.Next(0, lines.Length); 
    }while(linesHash.Contains(line)); 
    linesHash.Add(line); 
    linesAdded.Add(lines[line]); 
} 

注意私のコードは決して終わらないだろうとしたがって、forループを実行する前にいくつかのチェックを行う必要があります。どのように

4

var lines = File.ReadAllLines("file.txt").OrderBy(x => Guid.NewGuid()).Take(n);

+0

だから賢い!私はランダムなものを選択するこの方法を書き留めています。 –

+0

素晴らしい!この動作はどういうのですか? – Sajeetharan

+0

@Sajeetharan 'Guid.NewGuid()'を呼び出すたびに新しいグローバル一意識別子が生成されるので、コレクションはそれらの値によってランダムに並べ替えられます。次に、そこから最初の 'n'要素だけを取ります。非常にエレガントな答えBTW。 – dcg

0
var lines = File.ReadAllLines(@"file.txt"); 
var random = new Random(); 

var lines = Enumerable.Repeat(-1, n) // -1 is a filler and is discarded by the select. 
.Select(_ => random.Next(0, lines.Length - 1)) 
.Select(index => lines[index]); 

foreach(var line in lines) 
{ 
    recSongs.Items.Add(line); 
} 
関連する問題