2011-04-08 35 views
7

Tengo una colección de hilo en C#. Mi código se ve así:C#: cómo obtener la longitud del hilo en el hilo []

string[] lines = System.IO.File.ReadAllLines(@"d:\SampleFile.txt"); 

Lo que quiero hacer es encontrar la longitud máxima de la cadena en esa colección y almacenarla en la variable. Actualmente, codigo esto manualmente, ¿me gusta?

int nMaxLengthOfString = 0; 
for (int i = 0; i < lines.Length;i++) 
{    
    if (lines[i].Length>nMaxLengthOfString) 
    { 
     nMaxLengthOfString = lines[i].Length; 
    } 
} 

El código anterior hace el trabajo por mí, pero estoy buscando una cierta función integrada con el fin de mantener la eficiencia, ya que habrá miles de línea en mi_archivo :(

+0

AFAIK - no hay una función incorporada para hacer esto. Sin embargo, pueden ser otras formas de escribir lo mismo. Por ej. usando LINQ o usando la función Max .... No relacionado directamente con C#, pero había un hilo sobre el mismo tema en Python; puede leerlo si lo necesita para referencia: http://stackoverflow.com/questions/1292630/how-to- open-a-file-and-find-the-longest-length-of-a-line-and-then-print-it-out – sajoshi

Respuesta

17

Una forma más sencilla con LINQ sería:

int maxLength = lines.Max(x => x.Length); 

Nota que si está usando .NET 4, primero no necesita leer todas las líneas en una matriz, si no las necesita más adelante:

// Note call to ReadLines rather than ReadAllLines. 
int maxLength = File.ReadLines(filename).Max(x => x.Length); 

(Si no está utilizando .NET 4, es fácil escribir el equivalente de File.ReadLines.)

que será más eficiente en términos de memoria, pero fundamentalmente se se tiene que leer cada línea desde el disco, y usted tendrá necesidad de iterar sobre esas líneas para encontrar la longitud máxima. El acceso al disco es probable que sea el cuello de botella, por supuesto.

+0

No sabía * sobre la sobrecarga de 'Max' ... :) – Mehrdad

+0

¡simplemente rápido! –

3

La eficiencia no lo hará sin duda ser peor en su caso, si no mejor

Pero si usted está mirando para ser sucinta, lambdas tratar con LINQ:.

lines.Aggregate((a, b) => Math.Max(a.Length, b.Length)); 

Por cierto, punto menor: técnicamente puede dejar de leer si la cantidad de datos que queda es menor que la línea más larga que haya encontrado. Entonces, técnicamente puede guardar algunos pasos, aunque probablemente no valga la pena el código.


completamente irrelevante, pero sólo porque me da la gana, aquí está el (elegante!) Versión Esquema:

(reduce max (map length lines)) 
Cuestiones relacionadas