MC, 21:07 środa, 11.07.2012 r.
Ilustracja do artykułu: C# (C Sharp) - Dzielenie stringów separatorem char i string (metoda Split)

C# (C Sharp) - Dzielenie stringów separatorem char i string (metoda Split)

Zauważyłem, że sporemu gronu osób sprawia dużą trudność zagadnienie podziału ciągu znaków/stringa w języku C#, gdy ogranicznikiem ma być inny string. Sprawa tak na prawdę jest bardzo prosta, trzeba tylko uważnie spoglądać na podpowiedzi, lub zajrzeć do opisu metody Split() należącej do obiektu string, a szczególnie na to jakie parametry przyjmuje.

Dlaczego dzielenie stringów sprawia trudności?

O ile podział stringa w języku C# ze względu na pojedynczy znak (char) nie jest problemem, bo wywołanie funkcji string.Split() jest bardzo proste:
string imiona = "Alicja_;_Barbara_;_Celina_;_Elżbieta_;_Florentyna";
string[] listaImion0 = imiona.Split(';');
o tyle gdy ogranicznikiem (delimiterem) ma być inny string, to metoda string.Split() wymaga nieco innego podejścia niż w powyższym przykładzie. Poniższa próba za kończy się błędem kompilatora:
string imiona = "Alicja_;_Barbara_;_Celina_;_Elżbieta_;_Florentyna";
string[] listaImion1 = imiona.Split("_;_");
// -> The best overloaded method match for "string.Split(params char[])" has some invalid arguments
Równie częstym a i niestety błędnym podejściem jest to, które pokażę poniżej. Występuje ono najczęściej, gdy programista spojrzy na to jakie parametry wymagane są przez metodę Split() gdy chodzi o separatory złożone z kilku znaków, ale zrobi to niedostatecznie dokładnie:
string imiona = "Alicja_;_Barbara_;_Celina_;_Elżbieta_;_Florentyna";
string[] listaImion1 = imiona.Split("_;_", StringSplitOptions.None);

Podanie opcji podziału stringa nie wystarczy, ponieważ pierwszy argument jest zły. Funkcja split, nigdy nie przyjmuje zwykłego stringa!

Co w tej sytuacji?

Nie przyjmuje stringa, ale... przyjmuje tablicę stringów. Jeśli więc interesuje nas jeden delimiter w postaci stringa, należy wysłać jednoelementową tablicę stringów. Prosta modyfikacja poprzedniego kodu, pozwoli nam na osiągnięcie zamierzonego celu:
string imiona = "Alicja_;_Barbara_;_Celina_;_Elżbieta_;_Florentyna";
string[] listaImion1 = imiona.Split(new string[] {"_;_"}, StringSplitOptions.None);

Tym sposobem podzielimy dany ciąg znaków ze względu na string "_;_" i otrzymamy tym samym tablicę pojedynczych imion. Ot i cała trudność :)

Komentarze (2)

Imię:
Treść:
Administrator 2018-06-14 08:56:15
@matrix5145, dziękuję bardzo i zapraszam do przeczytania innych artykułów.
matrix5145 2018-06-13 23:03:47
Świetny poradnik. Wreszcie coś prostego i przejrzystego, bez zbędnego rozpisywania się.