2010-09-19 25 views
5

Tengo un archivo de texto con pocas cientos líneas, la estructura es bastante simple.¿Lees una línea aleatoria de un archivo? C#

nombre apellido

tengo que escoger un nombre de la lista aleatoria apellido & del archivo.

+0

Publique lo que tiene ahora, por favor ... –

Respuesta

14
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big 
Random rand = new Random(); 
return lines[rand.Next(lines.Length)]; 

Otra opción (y tal vez mejor) es tener la primera línea del archivo contiene el número de registros en ella y entonces no tiene que leer todo el archivo.

+4

+1: Odio que las personas respondan las preguntas que realmente puedo responder antes de que pueda, especialmente cuando usan exactamente el mismo código que :) –

+0

Gracias, acabo de Lo averigué. Pero tu camino parece mejor. – crap

+0

Eso funciona siempre que el archivo sea relativamente pequeño. He proporcionado una alternativa que le permite no tener que guardar todo el archivo en la memoria. – tvanfosson

11

Lea cada línea y lleve una cuenta, N, de las líneas que ha visto hasta ahora. Seleccione cada línea con probabilidad 1/N, es decir, siempre se elegirá la primera línea, la segunda línea se elegirá 1/2 veces para reemplazar la primera, la tercera 1/3 veces, ... De esta forma cada línea tiene una 1/N probabilidad de ser la línea seleccionada, solo tiene que leer el archivo una vez, y no necesita almacenar todo el archivo en la memoria en un momento dado.

Aquí hay una implementación que se puede adaptar a sus necesidades.

public string RandomLine(StreamReader reader) 
{ 
    string chosen = null; 
    int numberSeen = 0; 
    var rng = new Random(); 
    while ((string line = reader.ReadLine()) != null) 
    { 
     if (rng.NextInt(++numberSeen) == 0) 
     { 
      chosen = line; 
     } 
    } 
    return chosen; 
} 

basa en un C implementation para la selección de un nodo de una lista arbitrariamente larga vinculado.

+0

las matemáticas me parecen incorrectas. ¡No es la probabilidad de seleccionar la 1ª línea 1/n! para cuando llegues al final? –

+0

Las matemáticas aquí son buenas y agradables :) –

+0

@Itay: solo si crees en los comentarios: yo no. Pero, he sido engañado por la probabilidad antes. –

Cuestiones relacionadas