2010-07-16 6 views
33

J'ai un tableau de chaînes comme celui-ci.comment prendre tous les éléments de tableau sauf le dernier élément de C#

string[] queries avec des données de plusieurs chaînes.

Je souhaite ignorer la dernière chaîne de l'élément et prendre le reste. Je suis venu avec

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

Y at-il une meilleure alternative à cela?

+0

double possible de [Comment prendre tous, mais le dernier élément d'une séquence en utilisant LINQ ?] (https://stackoverflow.com/questions/1779129/how-to-take-all-but-the-last-element-in-a-sequence-using-linq) –

Répondre

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

Inutile d'inverser et de sauter. Prenez juste un élément de moins que dans le tableau.

Si vous voulez vraiment les éléments dans l'ordre inverse, vous pouvez virer sur un .Reverse() jusqu'à la fin.

+0

c'est une bonne réponse. – mohang

+0

Le tableau de chaînes n'a pas de méthode 'Take()'. Qu'est-ce que je rate? – TMC

+3

@TMC - Take() est une méthode d'extension pour IEnumerable. Vous devez inclure LINQ. –

7

Pourquoi ne pas avoir simplement:

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

qui leur retour dans le même ordre.

Append .Reverse() pour échanger l'ordre si c'est une condition nécessaire:

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

This answer from a related post est également intéressant de mentionner qu'il applique avec élégance à toute IEnumerable en une seule passe, sans qu'il soit nécessaire de connaître le nombre d'éléments à l'avance .

0

Modifié: Vous pouvez remplacer efficacement votre tableau avec le même tableau moins le dernier élément avec la ligne suivante ou code:

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

Si vous souhaitez créer une méthode qui fait cela pour vous , vous pouvez utiliser les éléments suivants:

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

et mettre en œuvre dans votre code comme ceci:

queries = TrimLastElement(queries); 
+0

Il n'y a pas de variables de type 'var'. 'var' est juste un mot-clé qui indique au compilateur d'inférer le type. Votre ligne de code est identique à 'var temp = temp.Take (temp.Length - 1) .ToArray ();'. – Enigmativity

+0

Je comprends ce que vous voulez dire, il devrait être comme 'temp = temp.Take (temp.Length - 1) .ToArray();' – ainasiart

+0

Merci pour vos commentaires! Mon message a maintenant été modifié. – nocolberri

2

l'équipe de Microsoft Reactive Extensions a les qui vous permet de faire des extensions interactives (NuGet « System.Interactive ») ceci:

var remStrings = queries.SkipLast(1); 
Questions connexes