uso una posicion extraer consultas caracteres caracter cadena buscar c#-4.0 linq-to-objects

c# 4.0 - posicion - cómo encontrar la cadena más larga en una cadena[] usando LINQ



extraer caracteres de una cadena c# (6)

Tengo una serie de cadenas de longitud variable. Actualmente tengo un bucle que recorre la matriz para encontrar la cadena más larga en la matriz. ¿Hay alguna forma en que pueda usar LINQ para escribirlo de manera más eficiente y / o más limpia?


Aunque esta es una vieja pregunta, me gustaría agregar que no se proporciona la respuesta más eficiente. No es de una sola línea, 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 con su respuesta, pero usar a Max dentro de Where es bastante lento cuando se trabaja 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).ToArray();

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


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

var strings = new string[] { "1", "02", "003", "0004", "00005" }; string longest = strings.OrderByDescending( s => s.Length ).First();

Salida: 00005


No tengo un compilador en este momento, pero esto también funcionará.

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


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 te da la cadena con la longitud máxima.


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

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

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