2010-07-16 23 views
33

Tengo una matriz de cadenas como esta.cómo tomar todos los elementos de la matriz excepto el último elemento en C#

string[] queries con datos de más de una cadena.

Quiero omitir la última cadena del elemento y tomar el resto. He llegado con

var remStrings = queries.Reverse().Skip(1).Take(queries.Length - 1); 

¿Hay una mejor alternativa a esto?

+0

duplicado posible de [Cómo tomar todos excepto el último elemento de una secuencia utilizando LINQ ?] (https://stackoverflow.com/questions/1779129/how-to-take-all-but-the-last-element-in-a-sequence-using-linq) –

Respuesta

68
var remStrings = queries.Take(queries.Length - 1); 

No hay necesidad de revertir y saltar. Solo toma un elemento menos que los que hay en la matriz.

Si realmente quería los elementos en el orden inverso, podría virar en un .Reverse() hasta el final.

+0

esta es una buena respuesta. – mohang

+0

string array no tiene el método 'Take()'. ¿Qué me estoy perdiendo? – TMC

+3

@TMC - Take() es un método de extensión para IEnumerable. Necesita incluir LINQ. –

7

¿Por qué no tienen:

var remStrings = queries.Take(queries.Length-1); 

Lo que les devolverá en el mismo orden.

Anexar .Reverse() para intercambiar el orden si eso es un requisito necesario:

var remStrings = queries.Take(queries.Length-1).Reverse(); 
1

This answer from a related post es también digno de mención, ya que elegantemente se aplica a cualquier IEnumerable en una sola pasada, sin necesidad de conocer su número de elementos de antemano .

0

Editado: Se podría reemplazar con eficacia su matriz con la misma matriz, menos el último elemento con la siguiente línea o código:

queries = queries.Take(queries.Length - 1).ToArray(); 

Si desea crear un método que hace esto para usted , entonces se podría utilizar lo siguiente:

public static string[] TrimLastElement(string[] arr) { 
    return arr.Take(arr.Length - 1).ToArray(); 
} 

Y ponerlo en práctica en el código de este modo:

queries = TrimLastElement(queries); 
+0

No hay variables de tipo 'var'. 'var' es solo una palabra clave que instruye al compilador a inferir el tipo. Su línea de código es idéntica a 'var temp = temp.Take (temp.Length - 1) .ToArray ();'. – Enigmativity

+0

Entiendo lo que quiere decir, debería ser como 'temp = temp.Take (temp.Length - 1) .ToArray();' – ainasiart

+0

¡Gracias por sus comentarios! Mi publicación ha sido editada. – nocolberri

2

equipo de reactivos Extensiones de Microsoft tiene las extensiones interactivos (NuGet 'System.Interactive') que le permite hacer esto:

var remStrings = queries.SkipLast(1); 
Cuestiones relacionadas