Pregunta C #: cómo obtener la longitud de la cuerda en la cadena []


Tengo una colección de cuerdas en C #. Mi código se ve así:

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 funciona bien para mí, pero estoy buscando alguna función incorporada para mantener la eficiencia, porque habrá miles de líneas en myfile :(


7
2018-04-08 05:39


origen


Respuestas:


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

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

Tenga en cuenta que si está utilizando .NET 4, no necesita leer todas las líneas en una matriz primero, 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.)

Eso será más eficiente en términos de memoria, pero fundamentalmente será tiene que leer cada línea desde el disco, y será 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.


17
2018-04-08 05:41



La eficiencia ciertamente no será peor en tu caso, si no mejor.

Pero si estás buscando ser sucinto, prueba lambdas con LINQ:

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

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


Completamente irrelevante, pero solo porque me da la gana, aquí está la versión del esquema (¡elegante!):

(reduce max (map length lines))

3
2018-04-08 05:41