2012-11-12 4 views
19

I zrobić split(' ') przez ciąg i chcę wyciągnąć pierwszy element zwrócił ciąg w celu uzyskania reszty ciąg.Szybki i sprytny sposób, aby uzyskać NON FIRST segment C# string

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

Chcę uzyskać wszystkie słowa, ale TO. To jest: to niesamowite STRING

Ciąg będzie zawsze co najmniej jedna pusta przestrzeń pomiędzy pierwszym i drugim słowie, bo trudno będzie umieścić zakodowane

Czy istnieje funkcja, która sprawia, że ​​jest? dziękuję

+0

+1 Ten wpis jest bardzo przydatny. (dla mnie conajmniej) –

+0

Dziękuję. Cieszę się, że to słyszę. – anmarti

+2

Czy możesz wyjaśnić, jeśli chcesz przetworzyć String-y lub Array-y? Włączyłem do mojej odpowiedzi także prawdopodobnie rozwiązanie dla tablic, nie tylko ciągi znaków –

Odpowiedz

37

spróbować

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

Zgodnie z komentarzem (IF X jest gwarantowana być prawidłowy ciąg co najmniej jedną spacją) prostsza wersja bez sprawdzania itp .:

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

to będzie zawierał symbol "... –

+0

@ Knaģis dzięki, poprawione. – Yahia

+1

Należy również rozważyć dodanie niektórych sprawdzeń, aby nie zostały przerwane, jeśli w ciągu nie ma spacji. – Servy

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

Jeśli jesteś na pre-.NET 4, trzeba trzymać .ToArray() w celu wywołania Pomiń - ponieważ przeciążenie string.join że trwa przeliczalny jako drugi parametr został po raz pierwszy dodany w .NET 4.

Podczas gdy to działa dobrze w ogólnym przypadku, jeśli zawsze chcesz usunąć tylko pierwsze słowo, istnieje lepszy sposób robienia tego, jak wskazał Reed w komentarzach:

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. 

Działa to lepiej w przypadku większych ciągów, ponieważ tylko Split trzeba szukać, dopóki nie znajdzie pierwszego miejsca, a następnie może utworzyć wynik tylko z dwoma łańcuchami - i uniknie String.Join, który może być również drogi, szczególnie w przypadku dłuższych łańcuchów.

+5

Nie jest to szczególnie szybkie, ale łatwe. Można go poprawić, używając tego przeciążenia: http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx –

+0

Dlaczego -1? Zauważ, że pytanie dotyczy tablicy w tytule, więc nie ma możliwości sprawdzenia, czy OP ma w rzeczywistości ciąg znaków, na którym można się dzielić. – driis

+0

I tak, nie jest to najbardziej wydajny sposób robienia tego, ale jest zwięzły i dla większości zastosowań różnica w wydajności nie ma znaczenia. – driis

17

Nie używaj Funkcja Split - a) wyszukuje każdy symbol ' ', nie tylko pierwszy. b) takie podejście wymaga dużej ilości danych do kopiowania w pamięci, co jest raczej powolną operacją dla łańcuchów.

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

Ponieważ tytuł pytanie wspomina tablicy, a nie ciąg, warto wspomnieć klasę ArraySegment - to pozwala na tworzenie wskaźnik do części tablicy (bez tworzenia nowej tablicy i kopiowanie danych):

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

Nie skompiluję ... (Split zwraca tablicę, prawdopodobnie nie miałeś na myśli tego) – driis

+2

dlaczego nie miałbym jej używać? – Fredrik

+0

@driis - tak, skopiuj wklejony wiersz i go nie zauważyłem –

0

Spróbuj

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

ma ten sam problem, co Kopiowanie dzielone wokół wszystkiego, a także Zamień będzie przemierzać ciąg po raz drugi, znajdując każdy mecz. plus nie działa dla 'TO TEN TO JEST JEST AMAAAAZING!' –

+0

co z 'Remove'? – codingbiz

26

dość dobrym rozwiązaniem byłoby wykorzystanie:

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

zauważyć, że jeśli po prostu chcesz wynikowy łańcuch można skrócić w ten sposób:

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

Używając przeciążenie string.Split który trwa max liczbę podziałów, można uniknąć konieczności przyłączenia się, a także dodatkowy nadmiar.

+2

_Właściwie_, drugim argumentem dla Split musi być 2 ;-). Poza tym zgadzam się. – driis

+0

@driis Ups - naprawiono. –

2

Bardzo prosto, można zrobić:

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

To będzie pracować dla rodzaju wejścia jesteś określającego (gdzie nie zawsze jest przestrzeń pomiędzy pierwszymi dwoma słowami w swoim ciągiem), ale na razie gdzie wejściowy ciąg znaków w ogóle nie ma spacji, zwraca cały ciąg bez zmian.

Powiązane problemy