Tengo una matriz de cadenas de longitud variable. Actualmente tengo un bucle que itera a través de la matriz para encontrar la cadena más larga en la matriz. ¿Hay alguna manera de que pueda usar LINQ para escribir de una manera más eficiente y/o más limpia?cómo encontrar la cadena más larga en una cadena [] usando LINQ
Respuesta
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
string [] strings;
return strings.OrderByDescending (s => s.Length).First();
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.
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
Sí, me doy cuenta de esto. Lo puse porque indica lo que está haciendo, en lugar de usar un efecto secundario de ordenar. –
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)
Esto encuentra la mayor longitud, pero no la cadena en sí. – Vache
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.
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); ' –
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.
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! –
- 1. Encontrar la secuencia repetitiva más larga en una cadena
- 2. ¿Cómo puedo encontrar la cadena más larga en Python?
- 3. Cadena más larga en numpy object_ array
- 4. PHP más corta/cadena más larga en la gama
- 5. ¿Cómo encontrar la palabra más larga en la lista?
- 6. Cómo encontrar la subcadena común más larga usando C++
- 7. ¿Cómo encontrar la subcadena común más larga usando árboles?
- 8. ¿Cómo declarar una cadena larga en Python?
- 9. ¿Cómo encontrar la palabra startswith en una cadena usando NSPredicate?
- 10. Algoritmo para encontrar lenth de secuencia más larga de espacios en blanco en una cadena dada
- 11. Python truncar una cadena larga
- 12. ¿La forma más eficiente de Python para elegir la cadena más larga en la lista?
- 13. Colección de cadena usando LINQ
- 14. Cómo convertir cadena a larga
- 15. Definición de una cadena larga en Razor
- 16. La forma más rápida de encontrar una Cadena en una matriz de cadena
- 17. ¿Cómo encontrar un número en una cadena usando JavaScript?
- 18. Encontrar una subsecuencia en la secuencia más larga
- 19. ¿Cómo comprimir/descomprimir una cadena de consulta larga en PHP?
- 20. Cómo caber una cadena larga en una etiqueta JLabel
- 21. Linq int en la cadena
- 22. ¿Cómo obtener la longitud de cadena más larga en una matriz
- 23. Convertir cadena a matriz int usando LINQ
- 24. Resaltar cadenas específicas en una cadena larga dada en Javascript
- 25. Cómo manejar una cadena larga declaración SQL en Python
- 26. Encontrar el carácter más frecuente en una cadena
- 27. Python: encontrar la cadena más cercano (de una lista) a otra cadena
- 28. cómo encontrar archivos que contienen una cadena usando egrep
- 29. ¿Cómo se selecciona la más larga 'cadena' de una tabla al agrupar
- 30. ¿Hay una mejor manera de dividir esta cadena usando LINQ?
genial! gracias, he usado FirstOrDefault(). Sin duda se ve más limpio, pero ¿hay alguna ventaja en el lado del rendimiento? – vrrathod
@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. –
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