2012-11-12 8 views
19

Faccio uno split(' ') su una stringa e voglio estrarre il primo elemento della stringa restituita per ottenere il resto della stringa.Modo rapido e intelligente per ottenere il segmento NON PRIMO di una stringa C#

f.e. "THIS IS AN AMAZING STRING".split(' ');

Voglio ottenere tutte le parole ma QUESTO. Questo è: è una stringa STUPEFACENTE

La stringa avrà sempre almeno uno spazio vuoto tra la prima e la seconda parola perché mi metterà difficile codificato

C'è una funzione che rende questo? grazie

+0

+1 Questo post è davvero utile. (per me almeno) –

+0

Grazie. Sono contento di sentire questo. – anmarti

+2

Potrebbe chiarire se stai cercando di elaborare String-s o Array-s? Ho incluso nella mia risposta anche una possibile soluzione per gli array, non solo le stringhe –

risposta

37

provare

string X = "THIS IS AN AMAZING STRING"; 
string Y = (X.IndexOf (" ") < 0) ? string.Empty : X.Substring (X.IndexOf (" ") + 1); // Y = IS AN AMAZING STRING 

Come da commento (SE X è garantito per essere una stringa valida con almeno uno spazio) una versione più semplice senza controllare ecc .:

string Y = X.Substring (X.IndexOf (" ") + 1); 
+2

questo includerà il simbolo '' ... –

+0

@ Knaģis grazie, corretto. – Yahia

+1

Considerate anche di aggiungere alcuni controlli in modo che non si interrompano se non c'è spazio nella stringa. – Servy

17
var a = "THIS IS AN AMAZING STRING".Split(' '); 
string amazing = String.Join(" ", a.Skip(1)); 

Se siete su pre-.NET 4, è necessario attenersi a .ToArray() alla fine della chiamata Skip - a causa del sovraccarico String.Join che prende enumerabile come secondo parametro è stato aggiunto per la prima volta in .NET 4.

Mentre questo funziona bene nel caso generale, se si desidera rimuovere sempre solo la prima parola, c'è un modo migliore per farlo, come sottolineato da Reed nei commenti:

var a = "THIS IS AN AMAZING STRING".Split(new char[] {' ' }, 2); 
string amazing = a[1]; //Perhaps do a length check first if you are not sure there is a space in the original string. 

Questo si comporta meglio per stringhe più grandi, poiché solo Split è necessario cercare finché non trova il primo spazio e quindi creare un risultato con solo due stringhe ed evita String.Join che potrebbe anche essere costoso, specialmente per stringhe più lunghe.

+5

Questo non è particolarmente veloce, ma è facile. Può essere migliorato usando questo sovraccarico: http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx –

+0

Perché -1? Nota che la domanda riguarda un array nel titolo, quindi non c'è modo di sapere se l'OP ha effettivamente la stringa da dividere in primo luogo. – driis

+0

E sì, questo non è il modo più performante per farlo, ma è conciso, e per la maggior parte degli usi la differenza di prestazioni non avrà importanza. – driis

17

Non utilizzare il Funzione Split - a) cerca ogni simbolo ' ', non solo il primo. b) questo approccio coinvolgerà molti dati di copia in giro che sono operazioni piuttosto lente per le stringhe.

var a = "THIS IS AN AMAZING STRING"; 
string result; 
var index = a.IndexOf(' '); 
if (index == -1) 
    result = null; 
else 
    result = a.Substring(index + 1); 

Dal momento che il titolo della questione menziona array, non stringa, è da segnalare la classe ArraySegment - questo consente di creare un puntatore alla parte della matrice (senza creare un nuovo array e copia dei dati):

var a = new int[] { 0, 1, 2, 3 }; 
var segment = new ArraySegment<int>(a, 1, a.Length - 1); 
+0

Non verrà compilato ... (Split restituisce un array, probabilmente non intendevi questo) – driis

+2

perché non dovrei usarlo? – Fredrik

+0

@driis - sì, copia-incolla la linea e non la nota –

0

Prova questa opzione

string str = "THIS IS AN AMAZING STRING"; 
    string firstString = str.Split(' ')[0]; //get the first string 
    string newStr = str.Replace(firstString + " ", ""); //remove the first string 

    //OR 

    string newStr = str.Remove(0, firstString.Length + 1); 
+0

ha lo stesso problema di Split copiando tutto e anche Sostituisci attraverserà la stringa per la seconda volta, trovando ogni corrispondenza. plus non funziona per 'QUESTO QUESTO È È AMAAAAZING!' –

+0

che dire 'Rimuovi'? – codingbiz

26

Una abbastanza buona sarebbe quella di utilizzare:

string original = "THIS IS AN AMAZING STRING"; 
string[] split = original.Split(new []{' '}, 2); 
string result = split[1]; 

Si noti che, se si desidera solo la stringa risultante, è possibile ridurre questo:

var result = original.Split(new []{' '}, 2)[1]; 

Utilizzando il sovraccarico di string.Split che prende un numero massimo di divisioni, si evita la necessità di unire così come l'overhead extra.

+2

_Bene effettivamente_, il secondo argomento di Split deve essere 2 ;-). A parte questo sono d'accordo. – driis

+0

@driis Oops - risolto. –

2

Molto semplicemente, si potrebbe fare:

string input = "THIS IS AN AMAZING STRING"; 
string result = input.Substring(input.IndexOf(' ') + 1); 

Questo funziona per il tipo di ingresso che si sta specificando (dove c'è sempre uno spazio tra le prime due parole nella stringa), ma per caso dove la stringa di input non ha spazi, restituisce l'intera stringa così com'è.

Problemi correlati