2017-10-12 3 views
0

Je suis un programmeur débutant pour VB.netComment répéter la liste (de chaîne) après l'index de liste randomize hors de portée

donc je suis coincé dans ce code, cela est pour le générateur de nom aléatoire.

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

Je continue à faire exception ArgumentOutOfRangeException après quelques terme, quelqu'un pourrait-il me aider? J'ai besoin du script pour lire la liste dès le début quand il atteindra la liste. Quelqu'un pourrait-il avoir une idée?

Toute aide serait appréciée.

+0

'Essayez ligne = rnd.Next (lines.Count)'. – Enigmativity

+0

Vous avez un défaut majeur dans votre code, car vous fermez le fichier texte après l'instruction 'Return', c'est-à-dire que vous ne le fermez pas du tout. Vous devriez l'ouvrir avec une instruction 'Using' et ensuite il sera fermé implicitement, indépendamment de la fin de la méthode. – jmcilhinney

+0

J'ai déjà supprimé à la fois reader.Close() et reader.Dispose() mais il ne va pas ré-élever la liste. même quand je retire (+ 1) la liste ne produira pas de résultat après 60+ résultat écrit – Hyuichiro

Répondre

1

Ce:

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

devrait être le suivant:

line = rnd.Next(lines.Count) 

La limite supérieure est exclusive lors de l'appel Random.Next et l'indice maximum dans une collection est 1 inférieure à la Count.

+0

Que puis-je faire pour lire la liste depuis le début lorsque la limite supérieure atteint? coincé là-dessus. depuis la liste que j'ai contient 148 noms, et j'utilise au hasard pour obtenir 2 noms en tant que couple. mais le script court après 60+ couple quand il devrait faire dans 74 couples. une idée? – Hyuichiro

+0

Si vous avez une nouvelle question à poser, posez une nouvelle question. Ne pas le greffer sur celui-ci. – jmcilhinney

0

Essayez ceci:

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 

est ici une implémentation plus simple pour vous:

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