2013-01-13 17 views
5

Czy istnieją jakiekolwiek uzasadnione powody, dla których nie ma nadmiernego obciążenia String.Split, które akceptuje ciąg ogranicznika i tekst do podziału?Dlaczego nie ma przeciążenia string.Split (string)?

string[] Split(string delimiter) 

które mogą być następnie wykorzystane jak

string input = "This - is - an - example"; 
string[] splitted = input.Split(" - "); 
// results in: 
// { "This", "is", "an", "example" } 

naprawdę wiem, że mogę łatwo utworzyć metody przedłużeniu, ale nie musi być ważny powód, dla którego nie został dodany.

Proszę zauważyć, że nie szukam rozwiązania, w jaki sposób podzielić ciąg za pomocą ogranicznika łańcucha, raczej szukam wyjaśnienia, dlaczego takie przeciążenie może powodować problemy. To dlatego, że nie sądzę, że to by naprawdę spowodowało problemy i naprawdę ciężko jest dla początkujących zrozumieć, dlaczego musimy przekazać rzeczywisty string[] zamiast zwykłego string jako ogranicznika.

+3

to sobie wyobrazić istnieje wiele pozornie prostych metod, które można dodać, ale dlatego możesz dodać własne metody za pomocą rozszerzeń. – glosrob

+0

Jak wynika z odpowiedzi, jest mało prawdopodobne, że otrzymasz odpowiedź na to pytanie. Moje * przypuszczenie * jest takie, że ma coś wspólnego ze studium użyteczności, w którym badani wpadli w jakiś kłopot, prawdopodobnie z powodu niewłaściwego radzenia sobie z przeciążeniem Char vs String. Tylko projektanci .NET mogą dokładnie odpowiedzieć na to pytanie, nie publikują tutaj. –

+1

@HansPassant Skontaktowałem się z [Eric Lippertem] (http://stackoverflow.com/users/88656/eric-lippert) na ten temat, z nadzieją, że może on dostarczyć więcej informacji. – GameScripting

Odpowiedz

3

Poprawianie pytanie być „Dlaczego jest obowiązkowy parametr StringSplitOptions Dzwoniąc String.split() z argument String []? " może dostarczyć odpowiedzi na twoje pytanie.

Należy zauważyć, że nie istnieje przeciążenie String.Split(), które akceptuje pojedynczy znak. Przeciążenie pobiera Char [], ale ponieważ jest to tablica parametrów, można ją nazwać pojedynczym znakiem i jest ona domyślnie rzutowana na Char []. na przykład

"1,2,3,4,5".Split(','); 

wywołuje sam Split() przeciążenie jako

"1,2,3,4,5".Split(new[] { ',' }); 

gdyby nie było przeciążenie Split(), który przyjął jeden argument string [] wtedy byłby w stanie wywołać dzielona przez przepuszczenie pojedynczy argument łańcuchowy.

Jednak przeciążenie nie istnieje, a parametr StringSplitOptions jest obowiązkowy podczas przekazywania ciągu znaków [] do podziału. Co do tego, dlaczego StringSplitOptions jest obowiązkowe, mogę tylko teoretyzować, ale może się zdarzyć, że przy dzieleniu za pomocą ciągu znacznie zwiększa się prawdopodobieństwo złożonego podziału na algorytm, z którym należy sobie poradzić. Aby zapewnić oczekiwane wyniki dla tych przypadków, lepiej jest zachować zachowanie metody, gdy trzeba wyznaczyć wiele ograniczników obok siebie. tj. StringSplitOptions jest obowiązkowy.

Można argumentować, że można mieć przeciążenie Split(String, StringSplitOptions), ale jak Ilja Iwanow wspomniano w odpowiedzi, trzeba zatrzymać się gdzieś i jest doskonale dobry sposób przekazywania pojedynczy łańcuch w.

+0

Pierwsza odpowiedź, która dotyczy mojego pytania, a także dobra. Dzięki. – GameScripting

+2

['StringSplitOptions'] (http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx) naprawdę nie jest tak zaawansowany, jego jedynymi członkami są' None' i 'RemoveEmptyEntries'. – CodeCaster

-2
string input = "This - is - an - example"; 
string[] splitted = Regex.Split(input," - "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 

to nie tylko kwestia przestrzeni, to exatcly pasuje do string separator, patrzeć

string input = "This,- is,- a,- complicated,- example"; 
string[] splitted = Regex.Split(input,",- "); 
foreach (string word in splitted) 
{ 
    MessageBox.Show(word); 
} 
+1

'Regex' jest wolniejszy niż" String.Split "i [nie należy używać' Regex', jeśli nie chodzi o wyrażenia regularne] (http://stackoverflow.com/a/2234376/808723). – GameScripting

+1

@GameScripting podany link nie wyjaśnia, dlaczego nie należy używać Regex, jeśli nie chodzi o wyrażenia regularne. – Default

+0

@Default Zobacz komentarze. Mówią dokładnie tak samo. Myślę, że użycie 'Regex' do dzielenia łańcuchów może [mylić dalszych programistów] (http://stackoverflow.com/a/1257322/808723), ponieważ nie ma tu mowy o wyrażeń regularnych. – GameScripting