2009-08-31 13 views
46

Mam ciąg znaków, który przychodzi jak:przyciąć wszystkie sznurki w tablicy

string email = "[email protected], [email protected], [email protected]"; 

Chcę podzielić ją na tablicę ciągów

Gdybym to zrobić:

string[] emails = email.Split(','); 

Otrzymuję spacje przed każdym adresem e-mail (po pierwszym):

emails[0] = "[email protected]" 
emails[1] = " [email protected]" 
emails[2] = " [email protected]" 

Jaki jest najlepszy sposób na to (albo lepszy sposób analizowania lub sposób wykończenia wszystkich ciągów w tablicy)?

emails[0] = "[email protected]" 
emails[1] = "[email protected]" 
emails[2] = "[email protected]" 
+2

Jeśli będzie tam cały czas, możesz dodać go do podziału ... ie: email.Split (","); – nilamo

Odpowiedz

24

Można również zastąpić wszystkie wystąpienia przestrzeni, a więc uniknąć pętli foreach:

string email = "[email protected], [email protected], [email protected]";  
string[] emails = email.Replace(" ", "").Split(','); 
+7

-1 (tylko dlatego, że został oznaczony jako * the * answer) Mimo że umieszcza wymagany tekst w tablicy, nie jest to najbardziej ekspresywne użycie dostępnego API. –

+9

@ 280Z28: To nie jest podstawa do przegłosowania. –

+6

Działa poprawnie dla tego konkretnego przykładu, ale nie obsługuje spacji dla wypadkowych elementów takich jak; "foo bar, kolejny element, blah_blah". Bryan Watts ma najlepszą odpowiedź IMO. – revgum

7

Można użyć trim():

string email = "[email protected], [email protected], [email protected]"; 
string[] emails = email.Split(','); 
emails = (from e in emails 
      select e.Trim()).ToArray(); 
+0

Ta odpowiedź jest poprawna, ale jest przesadna, ta odpowiedź ma najlepsze podejście: http://stackoverflow.com/questions/1355704/trim-all-strings-in-an-array/1355732#1355732 –

0

Korzystając String.Trim w foreach pętli, lub jeśli używasz .NET 3.5+ oświadczenie LINQ.

0

Alternatywnie, można podzielić za pomocą wyrażenia regularnego w postaci:

\s*,\s* 

tj

string[] emails = Regex.Split(email, @"\s*,\s*"); 

To będzie bezpośrednio spożywać okoliczne przestrzenie.

Wyrażenia regularne są zazwyczaj hitem wydajność, ale dałeś przykład wskazuje, że jest to coś, co planujemy zrobić raz w kodzie na krótki tablicy.

8

Zastosowanie Regex.Split aby uniknąć przycinania

var emails = Regex.Split(email, @",\s*"); 
17

jednej z następujących będzie działać. Polecam pierwszą ponieważ dokładniej wyraża łańcuch łączący.

string[] emails = email.Split(new string[] { ", " }, StringSplitOptions.None); 
string[] emails = email.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); 
+0

+1 Nie wiedziałem o opcjach. Pochodzę z Perla wszędzie widzę wyrażenia regularne. Dzięki opcjom Split jest do zrobienia. –

+1

+1 używamy LINQ tak bardzo, że zapominamy, że istnieją inne eleganckie opcje. –

175
emails.Split(',').Select(email => email.Trim()).ToArray() 
+0

Co zrobić, jeśli nie chcesz Linq jako zależności ... – Moismyname

+2

@Moismyname: Nie jestem pewien, co wiązanie doprowadziłoby cię do tej ścieżki, ale są inne odpowiedzi na twoje pytanie. –

+0

Ładne i czyste. Idealne dla mnie. Dzięki! – CrazyPaste

5

Można użyć roztworu jedną linię:

string[] emails = text.Split(',', StringSplitOptions.RemoveEmptyEntries); 
Array.ForEach<string>(emails, x => emails[Array.IndexOf<string>(emails, x)] = x.Trim()); 
1

Odpowiedź od Bryan Watts jest elegancki i prosty. On pośrednio odnosi się do tablicy ciągów utworzonej przez split().

pamiętać również swoją rozciągliwość jeśli czytasz plik i chcesz masować dane budując tablicę.

string sFileA = @"C:\Documents and Settings\FileA.txt"; 
string sFileB = @"C:\Documents and Settings\FileB.txt"; 

// Trim extraneous spaces from the first file's data 
string[] fileAData = (from line in File.ReadAllLines(sFileA) 
         select line.Trim()).ToArray(); 

// Strip a second unneeded column from the second file's data 
string[] fileBData = (from line in File.ReadAllLines(sFileB) 
         select line.Substring(0, 21).Trim()).ToArray(); 

Oczywiście, możesz użyć notacji Linq =>, jeśli wolisz.

string[] fileBData = File.ReadAllLines(sFileB).Select(line => 
          line.Substring(0, 21).Trim()).ToArray(); 

Mimo że moja odpowiedź powinna zostać zaksięgowana jako komentarz, nie mam wystarczającej liczby punktów reputacji, aby móc to skomentować.Ale uznałem tę dyskusję za nieocenioną przy opracowywaniu sposobu masowania danych przy użyciu ReadAllLines().

+0

Wecome to [SO]. Jeden mały punkt na twoim kodzie: Jeśli używasz Linq w ten sposób, możesz lepiej użyć 'File.ReadLines'. "ReadAllLines" "slurps" cały plik do tablicy w pamięci, co oczywiście może być problematyczne w przypadku dużych plików. 'ReadLines' czyta tylko jedną linię na raz, co jest wspaniałe, jeśli nie musisz zachować początkowej wersji zawartości. – RoadieRich

+0

Dzięki! Widzę, że przykład wykorzystujący ReadAllLines rozkłada się na bardzo duże pliki, zawierające na chwilę zarówno dane pierwotne, jak i przycięte wersje w pamięci. Strona dokumentacji File.ReadLines() ma również przykład, który pasuje do tej dyskusji. – RonSanderson

Powiązane problemy