2011-06-29 32 views

Respuesta

37

No va a ser mucho más eficiente, sin embargo, sería un poco más limpia de hacer algo como:

var strings = new string[] { "1", "02", "003", "0004", "00005" }; 

string longest = strings.OrderByDescending(s => s.Length).First(); 

Salida: 00005

+0

genial! gracias, he usado FirstOrDefault(). Sin duda se ve más limpio, pero ¿hay alguna ventaja en el lado del rendimiento? – vrrathod

+0

@vrrathod No hay ganancia de rendimiento, sigue haciendo la misma lógica iterativa que tenía, es solo una sintaxis más concisa, que es de lo que se trata LINQ. –

+0

Seguro que hace lo mismo. Así es como lo probé. Genere una matriz de 5000 cadenas. LINQ toma alrededor de 15 cpu ticks en mi máquina. Escribí un ciclo antiguo que compara la longitud de las cadenas. Vuelve en 0 ticks. El diff supongo que es para clasificar. – vrrathod

9
string [] strings; 
return strings.OrderByDescending (s => s.Length).First(); 
2
string[] arr = new string[] { "a", "aa", "aaa" }; 

var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First(); 

salida aaa

De esta manera, el código claramente le está dando la cadena con la longitud máxima.

+0

esto funciona. Pero es de O (N^2), por lo que tomaría un poco más de tiempo que la otra respuesta. Por Ej. en 5000 string array 'cadenas.OrderByDescending (s => s.Length) .First();' volvería en aproximadamente 15 ticks de CPU en mi máquina, mientras que esto tomaría aproximadamente 390. ticks. – vrrathod

+0

Sí, me doy cuenta de esto. Lo puse porque indica lo que está haciendo, en lugar de usar un efecto secundario de ordenar. –

-1

que no tienen un compilador en este momento, pero esto también va a funcionar.

string[] arr = new string[] { "a", "aa", "aaa" }; 
var longest = arr.Max(w => w.Length) 
+1

Esto encuentra la mayor longitud, pero no la cadena en sí. – Vache

9
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed); 

sintaxis agregada es un poco más difícil de leer que los otros métodos, pero en rigor es más eficiente que los otros enfoques que veo aquí, ya que no requiere clasificación. Solo una implementación de O (N).

EDIT: Este enfoque, junto con la mayoría de los otros aquí asume que no hay valores nulos en su lista, para que no f.Length emitir una excepción de referencia nula. Un operador ternario rápido (f! = Null? F.Length: 0) lo arreglaría si fuera válido para su enumerable.

+0

Prefiero esta respuesta, ya que de hecho responde la pregunta * y * creo que es la más eficiente para una respuesta de elemento individual cuando no se necesita una lista completa de las palabras más largas * y * con la edición adicional, Caleb menciona el manejo nulo cuerdas también. Dos pulgares arriba para mí. Para mayor comodidad: aquí está el código que probé que funciona bien: 'string longest = strings.Aggregate (string.Empty, (seed, f) => (f == null? 0: f.Length)> seed.Length? f: semilla); ' –

2

A pesar de que esta es una vieja pregunta que me gustaría añadir que no se proporciona la respuesta más eficiente. No es un trazador de líneas único, pero es el más rápido y devuelve una colección de las cadenas más largas, que OrderBy o Aggregate no proporcionan. Matt Ellen fue el más cercano a su respuesta, pero usando Max dentro de su Where lo hace más lento cuando trabajas con una gran colección.

La respuesta correcta debe ser:

int maxLength = collection.Max(x => x.Length); 
string[] longestStrings = collection.Where(x => x.Length == maxLength); 

considerar el uso del?. (en C# 6.0) y ?? operadores para verificar valores nulos si su colección puede contener estos.

+1

corrección: la pregunta pide una cadena, no una lista de las cadenas más largas. también su código necesita un '.ToArray() 'antes de ese último punto y coma para compilar. Pero sí lo recomiendo al proporcionar un código que pueda usarse fácilmente para proporcionar una lista de las palabras más largas o solo la primera palabra, con un simple '.FirstOrDefault()' vs '.ToArray()' al final de su código . Personalmente prefiero la flexibilidad de esta solución, así que me gusta más lo que proporciona su solución. ¡Gracias! –

Cuestiones relacionadas