2017-10-12 2 views
0

のうち、ランダマイズリストインデックスの後に(文字列の)リストを繰り返すために、私はので、私はこのコードで立ち往生してきた、これはランダムな名前ジェネレータのあるVB.netどの範囲

のための初心者プログラマです。

Private Function RandomLname(ByRef ranLname As String) As String 
 

 
     Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default) 
 
     Dim lines As New List(Of String) 
 
     Dim rnd As New Random() 
 
     Dim line As Integer 
 
     While reader.Peek <> -1 
 
      lines.Add(reader.ReadLine()) 
 
     End While 
 

 
     line = rnd.Next(lines.Count + 1) 
 
     'the error shown in this line 
 
     ranLname = lines(line) 
 
     Return ranLname 
 
     reader.Close() 
 
     reader.Dispose() 
 

 
    End Function

私はいくつかの実行後に例外ArgumentOutOfRangeException例外を得続ける、誰も私を助けることができますか? 私はlist.countに到達したときにリストを最初から読み直す必要があります。

ご協力いただければ幸いです。

+0

てみ 'ライン= rnd.Next(lines.Count)'。 – Enigmativity

+0

あなたのコードに重大な欠陥があります。あなたが 'Return'ステートメントの後にテキストファイルを閉じている、つまり全く閉じていないという点です。 'Using'ステートメントでそれを開く必要があります。そして、メソッドの終了方法にかかわらず暗黙的に閉じられます。 – jmcilhinney

+0

私はすでにreader.Close()とreader.Dispose()の両方を削除していますが、リストを再作成することはありません。また、リストを削除(+ 1)しても、60以上の結果が返された後に結果が生成されません。 – Hyuichiro

答えて

1

この:

line = rnd.Next(lines.Count + 1) 

はこのようになります。Random.Nextを呼び出して、コレクション内の最大インデックスがCountより1少ないとき

line = rnd.Next(lines.Count) 

上限は排他的です。

+0

上限から上限に達すると、リストを最初からもう一度読むことができますか?これに固執する。リストには148の名前が含まれているので、私はカップルとして2つの名前を得るためにランダムを使用します。それは74カップルで行う必要がある60 +カップルの後に実行されます。何か案が? – Hyuichiro

+0

新しい質問がある場合は、新しい質問をしてください。これにピギーバックしないでください。 – jmcilhinney

0

はこれを試してみてください:

Private Function RandomLname() As String 

    Dim reader As StreamReader = My.Computer.FileSystem.OpenTextFileReader("[pathto file.txt]", Encoding.Default) 
    Dim lines As New List(Of String) 
    Dim rnd As New Random() 
    Dim line As Integer 
    While reader.Peek <> -1 
     lines.Add(reader.ReadLine()) 
    End While 

    line = rnd.Next(lines.Count) 
    Return lines(line) 
    reader.Close() 
    reader.Dispose() 

End Function 

ここにあなたのためのシンプルな実装です:

Private rnd As New Random() 
Private Function RandomLname() As String 
    Return File.ReadAllLines("[pathto file.txt]").OrderBy(Function(x) rnd.Next()).FirstOrDefault() 
End Function